Каталог решений - Проблемы повторного использования кода в системе 1С:Предприятие 7.7 на примере процедуры ввода на основании

Проблемы повторного использования кода в системе 1С:Предприятие 7.7 на примере процедуры ввода на основании

Проблемы повторного использования кода в системе 1С:Предприятие 7.7 на примере процедуры ввода на основании

В наличии

Какой же это замечательный механизм — ввод одного документа на основании другого. Да вот работает он хорошо только интерактивно — нажал пользователь кнопочку и вот, готов новый подчиненный данному документ.
Однако иногда бывают ситуации, когда необходимо программно сформировать набор подчиненных документов. Вот тут и начинаются проблемы…

Категория:

Описание

Какой же это замечательный механизм — ввод одного документа на основании другого. Да вот работает он хорошо только интерактивно — нажал пользователь кнопочку и пожалуйста, готов новый подчиненный данному документ.
Однако иногда бывают ситуации, когда необходимо программно сформировать набор подчиненных документов. Вот тут и начинаются проблемы.

Первая проблема состоит в том, что во встроенном языке 1С всего одна процедура, которая инициирует выполнение предопределенной процедуры <ВводНаОсновании>, прописанной в модуле формы документа.
Речь идет о процедуре <ОткрытьФорму> ввода нового документа, последним параметром этой процедуры является документ-основание.

Вторая проблема носит более глобальный характер и связана с ориентацией встроенного языка 1С не на объектно-ориентированную, а на процедурную технологию программирования. Если говорить конкретно, то стандартными способами нельзя вызывать методы, написанные разработчиком в модуле формы объекта, в других местах, лежащих вне контекста данного объекта.
Короче говоря, нельзя расширить стандартный набор методов объекта.

Отсюда напрямую вытекает проблема повторного использования кода. Сколько раз приходилось иметь дело (особенно в типовых конфигурациях) с тем, что некая процедура, гармонично работающая в конфигурации, должна быть использована где-то еще, но увы…

Хорошо конечно, если автор(ы) конфигурации позаботился о возможности повторного использования кода и написал в Глобальном модуле процедуры или функции с волшебным словом «Экспорт». Однако так бывает достаточно редко.

Итак, вернемся к проблеме группового ввода документов на основании.

Допустим, каким-то образом мы идем по выборке документов одного вида и вводим подчиненные документы, например:

ДокРеализация = СоздатьОбъект("Документ.Реализация");
ДокРеализация.ВыбратьДокументы(НачДата,КонДата);

Пока ДокРеализация.ПолучитьДокумент() = 1 Цикл
   ОткрытьФорму("Документ.СчетФактура",,ДокРеализация);
КонецЦикла;

Но, при выполнении данного кода откроется форма заполненного на основании «Реализации» документа «СчетФактура» и при сохранении запишется только первый «СчетФактура». Для остальных даже не откроются формы.

Для того, чтобы избежать этого, в модуле формы документа «СчетФактура» в процедуре <ПриОткрытии> можно написать следующий код:

Процедура ПриОткрытии()
   //...
   Если Форма.Параметр = "ВводНаОсновании" Тогда
      Попытка
         Записать();
      Исключение
         Сообщить("Ошибка записи документа " + Вид() + " № " + НомерДок + " от " + ДатаДок);
      КонецПопытки;

      СтатусВозврата(0);
      Возврат;
   КонецЕсли;
   //...
КонецПроцедуры

Также необходимо исправить и обхода документов в цикле:

ДокРеализация = СоздатьОбъект("Документ.Реализация");
ДокРеализация.ВыбратьДокументы(НачДата,КонДата);

Пока ДокРеализация.ПолучитьДокумент() = 1 Цикл
   Конт = "ВводНаОсновании";
   ОткрытьФорму("Документ.СчетФактура",Конт,ДокРеализация);
КонецЦикла;

При таком подходе сначала будет выполняться процедура «ВводНаОсновании» модуля формы документа «СчетФактура», а затем процедура «ПриОткрытии», в которой анализируется переданный в форму параметр, и при его соответствующем значении осуществляется запись документа и отмена открытия его формы.

Вот и все.

Следует отметить, что место вставки кода в процедуру <ПриОткрытии> зависит от того, какие действия в ней осуществляются. Если присваиваются значения реквизитов, то код вставляется после этих действий.

has been added to your cart:
Оформление заказа