Добрый вечер уважаемые!
Помогите в решении следующей задачи: нужно обойти все документы конфигурации (КА 1.1.46.4) и в тех документах, где есть реквизит Проект, выставить его в определенное значение. Ума не приложу как это организовать. Смотреть в конфиге по документам в котором есть этот реквизит и потом обработкой заполнять - умом тронуться можно :)
Спасибо.
P.S. Может есть какая красивая обработка для таких целей?
(2) Cooler, это все хорошо, спасибо.
Я наверное не правильно выразился. Обойти надо все документы (виды) в режиме Предприятия.
Помню в 7.7 была такая фишка. Т.е. обходим все документы через Метаданные....
И у каждого обходим реквизиты, сравниваем реквизит на тип или имя (не помню) и если "оно" то выдаём в список
либо обрабатываем. Воооот.
А как это повторить в 8ке что то "не помню" :)
(5) AnryMc:
1) обходим документы по виду и ищем реквизит, если нашли то
2) выбираем документы этого вида и заменяем реквизит (а хоть из формы обработки)
3) ищем дальше...
(3) Serg0FFan, в 8 тоже есть метаданные, и по ним можно обходить. Например:
Для Каждого МетаданныеДокумент Из Метаданные Цикл
Для Каждого Реквизит Из МетаданныеДокумент.Реквизиты Цикл
Если Реквизит.Имя = "Проект" Тогда
ДокВыборка = Документы[МетаданныеДокумент.Имя].Выбрать();
Пока ДокВыборка.Следующий() Цикл
//бла-бла-бла
КонецЦикла;
КонецЕсли;
КонецЦикла
КонецЦикла;
(10) Cooler, ну это понятно :)
Тут еще одна засада обнаружилась, документы ПлатёжноеПоручениеВходящее(Исходящее) не содержат в явном виде реквизит Проект %)
Зато если открыть форму в конфигураторе то можно увидеть что он все же есть на форме и свойства его такие:
Имя: Проект
Данные: ЭлементыФормы.РасшифровкаПлатежа.ТекущиеДанные.Проект
и как интересно обратиться к нему? %) Т.е. думаю вот, будет ли он найден при проходе по алгоритму предложенному уважаемым ipoloskov?
(11) Serg0FFan, В таком случае нужно еще делать цикл по табличным частям
Для Каждого МетаданныеДокумент Из Метаданные Цикл
Для Каждого МетаданныеТабличнаяЧасть Из МетаданныеДокумент.ТабличныеЧасти Цикл
Для Каждого Реквизит Из МетаданныеТабличнаяЧасть.Реквизиты Цикл
Если Реквизит.Имя = "Проект" Тогда
ДокВыборка = Документы[МетаданныеДокумент.Имя].Выбрать();
Пока ДокВыборка.Следующий() Цикл
//бла-бла-бла
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;
(12) ipoloskov, все сделал, получилось, только вот проблема с табличной частью, не пишет в неё, выдаёт ошибку:
{Форма.Форма.Форма(17)}: Поле объекта не обнаружено (Проект)
Если ОбъектДокумент.Проект <> Проект Тогда
Вот сам код обработки:
Процедура КнопкаВыполнитьНажатие(Кнопка)
Счетчик = 0;
Если ИспользоватьТранзакцию Тогда
НачатьТранзакцию();
КонецЕсли;
Для Каждого МетаданныеДокумент Из Метаданные.Документы Цикл
Для Каждого МетаданныеТабличнаяЧасть Из МетаданныеДокумент.ТабличныеЧасти Цикл
Для Каждого Реквизит Из МетаданныеТабличнаяЧасть.Реквизиты Цикл
//Для Каждого Реквизит Из МетаданныеДокумент.Реквизиты Цикл
Если Реквизит.Имя = "Проект" Тогда
ДокВыборка = Документы[МетаданныеДокумент.Имя].Выбрать();
Пока ДокВыборка.Следующий() Цикл
ОбъектДокумент = ДокВыборка.ПолучитьОбъект();
Если ОбъектДокумент.Проект <> Проект Тогда
ОбъектДокумент.Проект = Проект;
//ОбъектДокумент.ПриЗаписиПерепроводить = Ложь;
ОбъектДокумент.Записать();
Сообщить ("Записан документ :"+ОбъектДокумент);
Счетчик = Счетчик + 1;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;
Если ИспользоватьТранзакцию Тогда
ЗафиксироватьТранзакцию();
КонецЕсли;
Сообщить ("Исправлено документов :"+Счетчик);
КонецПроцедуры
(1) Serg0FFan, Почти во всех типовых конфигурациях (или на диске ИТС) есть типовая обработка "Групповая обработка документов и справочников" с её помощью можно отобрать нужные и установить нужный реквизит в нужное значение...
(4) AnryMc, отобрать да, только если я заранее знаю что такой реквизит у документа есть! А если не знаю? Может быть там таких документов до едрени фени! Вот потому бы и помог обход всех документов в конфигурации и поиск реквизита по параметрам. Если реквизит есть, то уже тогда делаем выборку докумнтов такого вида и заполняем у них у всех этот реквизит. Вот только как в коде это изобразить не очень понимаю. :)
Для Каждого МетаданныеДокумент Из Метаданные.Документы Цикл
Для Каждого МетаданныеТабличнаяЧасть Из МетаданныеДокумент.ТабличныеЧасти Цикл
Для Каждого Реквизит Из МетаданныеТабличнаяЧасть.Реквизиты Цикл
Если Реквизит.Имя = "Проект" Тогда
ДокВЫборка = Документы[МетаданныеДокумент.Имя].Выбрать();
Пока ДокВыборка.Следующий() ЦИкл
ОбъектДокумент = ДокВыборка.ПолучитьОбъект();
Для Каждого Строчка Из ОбъектДокумент[МетаданныеТабличнаяЧасть.Имя] Цикл
Строчка.Проект = Проект;
КонецЦикла;
ОбъектДокумент.Записать();
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Для Каждого Реквизит Из МетаданныеДокумент.Реквизиты Цикл
Если Реквизит.Имя = "Проект" Тогда
ДокВЫборка = Документы[МетаданныеДокумент.Имя].Выбрать();
Пока ДокВыборка.Следующий() Цикл
ДокументОбъект = ДокВыборка.ПолучитьОбъект();
ДокументОбъект.Проект = Проект;
ДокументОбъект.Записать();
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецЦИкла;
Все сделал, всем спасибо :)
Еще один вопрос, вытекающий :)))
А можно теперь как то оформить код (теоретически) в виде запроса? Чтобы обработка не лопатила 20 минут все документы, а выбрала только нужные по условию и уже дальше выборку обработала. Применяя в запросе объект Метаданные...
(19) Serg0FFan, даю наводку, текст запроса имеет как не странно тип текст. как совет, постройте текст запроса конструктором для одного документа и в этом тексте имена документов замените на переменные...