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