Проблемы повторного использования кода в системе 1С:Предприятие 7.7 на примере процедуры ввода на основании
Какой же это замечательный механизм — ввод одного документа на основании другого. Да вот работает он хорошо только интерактивно — нажал пользователь кнопочку и вот, готов новый подчиненный данному документ.
Однако иногда бывают ситуации, когда необходимо программно сформировать набор подчиненных документов. Вот тут и начинаются проблемы…
- Описание
- Подробнее
Описание
Однако иногда бывают ситуации, когда необходимо программно сформировать набор подчиненных документов. Вот тут и начинаются проблемы.
Первая проблема состоит в том, что во встроенном языке 1С всего одна процедура, которая инициирует выполнение предопределенной процедуры <ВводНаОсновании>, прописанной в модуле формы документа.
Речь идет о процедуре <ОткрытьФорму> ввода нового документа, последним параметром этой процедуры является документ-основание.
Вторая проблема носит более глобальный характер и связана с ориентацией встроенного языка 1С не на объектно-ориентированную, а на процедурную технологию программирования. Если говорить конкретно, то стандартными способами нельзя вызывать методы, написанные разработчиком в модуле формы объекта, в других местах, лежащих вне контекста данного объекта.
Короче говоря, нельзя расширить стандартный набор методов объекта.
Отсюда напрямую вытекает проблема повторного использования кода. Сколько раз приходилось иметь дело (особенно в типовых конфигурациях) с тем, что некая процедура, гармонично работающая в конфигурации, должна быть использована где-то еще, но увы…
Хорошо конечно, если автор(ы) конфигурации позаботился о возможности повторного использования кода и написал в Глобальном модуле процедуры или функции с волшебным словом «Экспорт». Однако так бывает достаточно редко.
Итак, вернемся к проблеме группового ввода документов на основании.
Допустим, каким-то образом мы идем по выборке документов одного вида и вводим подчиненные документы, например:
ДокРеализация = СоздатьОбъект("Документ.Реализация"); ДокРеализация.ВыбратьДокументы(НачДата,КонДата); Пока ДокРеализация.ПолучитьДокумент() = 1 Цикл ОткрытьФорму("Документ.СчетФактура",,ДокРеализация); КонецЦикла;
Но, при выполнении данного кода откроется форма заполненного на основании «Реализации» документа «СчетФактура» и при сохранении запишется только первый «СчетФактура». Для остальных даже не откроются формы.
Для того, чтобы избежать этого, в модуле формы документа «СчетФактура» в процедуре <ПриОткрытии> можно написать следующий код:
Процедура ПриОткрытии() //... Если Форма.Параметр = "ВводНаОсновании" Тогда Попытка Записать(); Исключение Сообщить("Ошибка записи документа " + Вид() + " № " + НомерДок + " от " + ДатаДок); КонецПопытки; СтатусВозврата(0); Возврат; КонецЕсли; //... КонецПроцедуры
Также необходимо исправить и обхода документов в цикле:
ДокРеализация = СоздатьОбъект("Документ.Реализация"); ДокРеализация.ВыбратьДокументы(НачДата,КонДата); Пока ДокРеализация.ПолучитьДокумент() = 1 Цикл Конт = "ВводНаОсновании"; ОткрытьФорму("Документ.СчетФактура",Конт,ДокРеализация); КонецЦикла;
При таком подходе сначала будет выполняться процедура «ВводНаОсновании» модуля формы документа «СчетФактура», а затем процедура «ПриОткрытии», в которой анализируется переданный в форму параметр, и при его соответствующем значении осуществляется запись документа и отмена открытия его формы.
Вот и все.
Следует отметить, что место вставки кода в процедуру <ПриОткрытии> зависит от того, какие действия в ней осуществляются. Если присваиваются значения реквизитов, то код вставляется после этих действий.