====== Настройка проведения документа ====== Актуально для ERP 2.5.8.369 (БСП 3.1.6.425) ===== Настройка документа ===== У документа в параметре "**Удаление движений**" устанавливаем "**Не удалять автоматически**". Удалением движений мы будем управлять самостоятельно. ===== Описать механизм конфигурации ===== В общем модуле **ПроведениеДокументов.УчетныеМеханизмыКонфигурации()** или **ПроведениеДокументовЛокализация.ДополнитьУчетныеМеханизмыКонфигурации()** добавить строку вида\\ ''МеханизмыКонфигурации.Вставить("ФЕС_ИмяМеханизма", "ФЕС_ИмяМодуля");''\\ или\\ ''МеханизмыКонфигурации.Вставить("ФинансовыйРезультат", "РегистрыНакопления.ФинансовыеРезультаты");''\\ где\\ первый параметр - имя механизма\\ второй параметр - общий модуль или менеджер, где располагается логика.\\ В случае, если вторым параметром указан общий модуль, его доступность: * сервер, * внешнее соединение, * клиент (обычное приложение). ===== Регистрация механизма в документе ===== В модуле менеджера нового документа, а так же в существующих документах, которые должны двигать регистры механизма **ФЕС_ИмяМеханизма**, определим или расширим процедуру, которая добавит наш документ к новому механизму. // Описывает учетные механизмы используемые в документе для регистрации в механизме проведения. // // Параметры: // МеханизмыДокумента - Массив - список имен учетных механизмов, для которых будет выполнена // регистрация в механизме проведения. // Процедура ЗарегистрироватьУчетныеМеханизмы(МеханизмыДокумента) Экспорт МеханизмыДокумента.Добавить("ФЕС_ИмяМеханизма"); КонецПроцедуры ===== Описание параметров для проведения документа ===== Добавить в модуль **ФЕС_ИмяМодуля** функцию **ПараметрыДляПроведенияДокумента**\\ Оформление областей: ПрограммныйИнтерфейс/Проведение // Формирует параметры для проведения документа по регистрам учетного механизма через общий механизм проведения. // // Параметры: // Документ - ДокументОбъект - записываемый документ // Свойства - См. ПроведениеДокументов.СвойстваДокумента // // Возвращаемое значение: // Структура - См. ПроведениеДокументов.ПараметрыУчетногоМеханизма // Функция ПараметрыДляПроведенияДокумента(Документ, Свойства) Экспорт Параметры = ПроведениеДокументов.ПараметрыУчетногоМеханизма(); // Проведение Если Свойства.РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда Параметры.ПодчиненныеРегистры.Добавить(Метаданные.РегистрыСведений.ФЕС_Промоакции); Параметры.ПодчиненныеРегистры.Добавить(Метаданные.РегистрыНакопления.ФЕС_ПромоакцииСогласованноеКоличество); КонецЕсли; // Контроль Если Свойства.РежимЗаписи <> РежимЗаписиДокумента.Запись Тогда //ТипДокумента = ТипЗнч(Документ); // //Если ТипДокумента = Тип("ДокументОбъект.ЗаказПоставщику") Тогда // // Параметры.КонтрольныеРегистрыИзменений.Добавить(Метаданные.РегистрыНакопления.ФЕС_ЗапросыНаЗакупку); // //КонецЕсли; КонецЕсли; Возврат Параметры; КонецФункции и процедуру **ОтразитьДвижения** // Процедура формирования движений по подчиненным регистрам закупок. // // Параметры: // ТаблицыДляДвижений - Структура - таблицы данных документа // Движения - КоллекцияДвижений - коллекция наборов записей движений документа // Отказ - Булево - признак отказа от проведения документа. // Процедура ОтразитьДвижения(ТаблицыДляДвижений, Движения, Отказ) Экспорт Если Отказ Тогда Возврат; КонецЕсли; ПроведениеДокументов.ОтразитьДвижения(ТаблицыДляДвижений, Движения, "ФЕС_Промоакции"); ПроведениеДокументов.ОтразитьДвижения(ТаблицыДляДвижений, Движения, "ФЕС_ПромоакцииСогласованноеКоличество"); КонецПроцедуры Добавление регистра в параметры **КонтрольныеРегистрыИзменений** указывает, что по регистру проводится контроль. ===== Контроль изменений ===== Необходимо добавить процедуру **ИнициализироватьДанныеКонтроляИзменений()**, где текстом запроса из предварительно созданной временной таблицы и таблицы остатков по регистру выбираем данные. Ошибки фиксируются и выводятся в процедуре "СообщитьОРезультатахКонтроляИзменений" Если контроль не нужен, просто поставить заглушки // Формирует тексты запросов для контроля изменений записанных движений регистров. // // Параметры: // Запрос - Запрос - запрос, хранящий параметры используемые в списке запросов // ТекстыЗапроса - СписокЗначений - список текстов запросов и их имен. // Документ - ДокументОбъект - записываемый документ. // Процедура ИнициализироватьДанныеКонтроляИзменений(Запрос, ТекстыЗапроса, Документ) Экспорт КонецПроцедуры // Выводит сообщения пользователю при наличии ошибок контроля изменений записанных движений регистров. // // Параметры: // РезультатыКонтроля - Структура - таблицы с результатами контроля изменений // Документ - ДокументОбъект - записываемый документ // Отказ - Булево - признак отказа от проведения документа. // Процедура СообщитьОРезультатахКонтроляИзменений(РезультатыКонтроля, Документ, Отказ) Экспорт КонецПроцедуры и заглушку для контроля даты запрета // Дополняет текст запроса механизма проверки даты запрета по таблице изменений. // // Параметры: // Запрос - Запрос - используется для установки параметров запроса. // // Возвращаемое значение: // Соответствие - соответствие имен таблиц изменения регистров и текстов запросов. // Функция ТекстыЗапросовКонтрольДатыЗапретаПоТаблицеИзменений(Запрос) Экспорт СоответствиеТекстовЗапросов = Новый Соответствие(); Возврат СоответствиеТекстовЗапросов; КонецФункции ===== Вызовы подсистемы проведения документов при событиях документа ===== Событие "Перед записью"\\ ''ПроведениеДокументов.ПередЗаписьюДокумента(ЭтотОбъект, РежимЗаписи, РежимПроведения);''\\ \\ Событие "Обработка проведения"\\ ''ПроведениеДокументов.ОбработкаПроведенияДокумента(ЭтотОбъект, Отказ);''\\ \\ Событие "Обработка удаления проведения"\\ ''ПроведениеДокументов.ОбработкаУдаленияПроведенияДокумента(ЭтотОбъект, Отказ);''\\ \\ Событие "При записи"\\ ''ПроведениеДокументов.ПриЗаписиДокумента(ЭтотОбъект, Отказ);''\\ ===== Добавление процедур и функций в менеджер документа ===== При проведении документа вызов ПроведениеДокументов.ОбработкаПроведенияДокумента идет в модуль менеджера документа, где вызывается процедура **ДанныеДокументаДляПроведения()**, в которой инициализируются параметры запроса и тексты запросов для движений. // Возвращает таблицы для движений, необходимые для проведения документа по регистрам учетных механизмов. // // Параметры: // Документ - ДокументСсылка - ссылка на документ, по которому необходимо получить данные // Регистры - Структура - список имен регистров, для которых необходимо получить таблицы // ДопПараметры - Структура - дополнительные параметры для получения данных, определяющие контекст проведения. // // Возвращаемое значение: // Структура - коллекция элементов: // * Таблица<ИмяРегистра> - ТаблицаЗначений - таблица данных для отражения в регистр. // Функция ДанныеДокументаДляПроведения(Документ, Регистры, ДопПараметры = Неопределено) Экспорт // Комментарий: Подключаем документ к подсистеме Проведение документов. Если ДопПараметры = Неопределено Тогда ДопПараметры = ПроведениеДокументов.ДопПараметрыИнициализироватьДанныеДокументаДляПроведения(); КонецЕсли; Запрос = Новый Запрос; ТекстыЗапроса = Новый СписокЗначений; Если Не ДопПараметры.ПолучитьТекстыЗапроса Тогда //////////////////////////////////////////////////////////////////////////// // Создадим запрос инициализации движений ЗаполнитьПараметрыИнициализации(Запрос, Документ); //////////////////////////////////////////////////////////////////////////// // Сформируем текст запроса ТекстЗапросаТаблицаФЕС_Промоакции(Запрос, ТекстыЗапроса, Регистры); ТекстЗапросаТаблицаФЕС_ПромоакцииСогласованноеКоличество(Запрос, ТекстыЗапроса, Регистры); КонецЕсли; //////////////////////////////////////////////////////////////////////////// // Получим таблицы для движений Возврат ПроведениеДокументов.ИнициализироватьДанныеДокументаДляПроведения(Запрос, ТекстыЗапроса, ДопПараметры); КонецФункции Параметры инициализации для таблиц проведения Процедура ЗаполнитьПараметрыИнициализации(Запрос, ДокументСсылка) Если Запрос = Неопределено Тогда Запрос = Новый Запрос; КонецЕсли; Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; Запрос.УстановитьПараметр("Ссылка", ДокументСсылка); Запрос.Текст = "ВЫБРАТЬ | ТаблицаДокумента.Номер КАК Номер, | ТаблицаДокумента.Дата КАК Период, | ТаблицаДокумента.ТорговаяСеть КАК ТорговаяСеть, | ТаблицаДокумента.Организация КАК Организация, | ТаблицаДокумента.Автор КАК Автор, | ТаблицаДокумента.ВидСкидки КАК ВидСкидки, | ТаблицаДокумента.ДатаНачалаОтгрузки КАК ДатаНачала, | ТаблицаДокумента.ДатаОкончанияОтгрузки КАК ДатаОкончания |ИЗ | Документ.ФЕС_Промоакция КАК ТаблицаДокумента |ГДЕ | ТаблицаДокумента.Ссылка = &Ссылка"; РезультатЗапроса = Запрос.Выполнить(); Реквизиты = РезультатЗапроса.Выбрать(); Реквизиты.Следующий(); Для Каждого Колонка Из РезультатЗапроса.Колонки Цикл Запрос.УстановитьПараметр(Колонка.Имя, Реквизиты[Колонка.Имя]); КонецЦикла; // Фиксированные параметры запроса. Запрос.УстановитьПараметр("ИдентификаторМетаданных", ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ТипЗнч(ДокументСсылка))); КонецПроцедуры И добавить процедуры, формирующие таблицы движений Функция ТекстЗапросаТаблицаФЕС_Промоакции(Запрос, ТекстыЗапроса, Регистры) ИмяРегистра = "ФЕС_Промоакции"; Если НЕ ПроведениеДокументов.ТребуетсяТаблицаДляДвижений(ИмяРегистра, Регистры) Тогда Возврат ""; КонецЕсли; ТекстЗапроса = "ВЫБРАТЬ | &Ссылка КАК Регистратор, | &Организация КАК Организация, | &ТорговаяСеть КАК ТорговаяСеть, | ФЕС_ПромоакцияСубъектыПромоакции.Контрагент КАК Контрагент, | ФЕС_ПромоакцияСубъектыПромоакции.Партнер КАК Партнер, | ФЕС_ПромоакцияСпецификацияПромоакции.Номенклатура КАК Номенклатура, | &Ссылка КАК Промоакция, | &ДатаНачала КАК ДатаНачала, | КОНЕЦПЕРИОДА(&ДатаОкончания, ДЕНЬ) КАК ДатаОкончания, | ФЕС_ПромоакцияСпецификацияПромоакции.ПроцентСкидки КАК ПроцентСкидки, | &ВидСкидки КАК ВидСкидки |ИЗ | Документ.ФЕС_Промоакция.СпецификацияПромоакции КАК ФЕС_ПромоакцияСпецификацияПромоакции | ЛЕВОЕ СОЕДИНЕНИЕ Документ.ФЕС_Промоакция.СубъектыПромоакции КАК ФЕС_ПромоакцияСубъектыПромоакции | ПО ФЕС_ПромоакцияСпецификацияПромоакции.Ссылка = ФЕС_ПромоакцияСубъектыПромоакции.Ссылка |ГДЕ | ФЕС_ПромоакцияСпецификацияПромоакции.Ссылка = &Ссылка"; ТекстыЗапроса.Добавить(ТекстЗапроса, ИмяРегистра); Возврат ТекстЗапроса; КонецФункции Ну обновление вспомогательных данных не помешает после всего. PS Внимательнее, если копипастим тексты процедур из статьи :) Не пропускаем ненужного.