В примере требуется вести учет партий закупки запчастей (Номенклатура) на автомобили (НаправленияДеятельности), используя при этом существующий в конфигурации ERP 2.5 документ "ПриобретениеТоваровУслуг". Для этого в конфигурацию добавляем новый регистр накопления "АТХ_ПартииНоменклатурыДляРемонтовТверь_НД" со следующими измерениями и ресурсами:
НаправлениеДеятельности (СправочникСсылка.НаправленияДеятельности) ПТУ (ДокументСсылка.ПриобретениеТоваровУслуг) Номенклатура (СправочникСсылка.Номенклатура) Цена (ОпределяемыйТип.ДенежнаяСуммаНеотрицательная)
Количество (Число (15,3) Неотрицательное)
Включаем как обычно РегистрНакопления.АТХ_ПартииНоменклатурыДляРемонтовТверь_НД в движения Документ.ПриобретениеТоваровУслуг. Но сами движения будем делать через "Механизмы конфигурации".
1. Сначала ищем в общем модуле ПроведениеДокументов функцию УчетныеМеханизмыКонфигурации и добавляем туда новый механизм конфигурации АТХ_ПартииНоменклатурыДляРемонтовТверь_НД:
Функция УчетныеМеханизмыКонфигурации() Экспорт
МеханизмыКонфигурации = Новый Структура;
МеханизмыКонфигурации.Вставить("АдресныйСклад", "СкладыСервер");
// ..............
МеханизмыКонфигурации.Вставить("ФинансовыйРезультат", "РегистрыНакопления.ФинансовыеРезультаты");
//++ НЕ УТ
МеханизмыКонфигурации.Вставить("ОбесценениеВНА", "ОбесценениеВНАСервер");
//-- НЕ УТ
//доработка {
МеханизмыКонфигурации.Вставить("АТХ_ПартииНоменклатурыДляРемонтовТверь_НД", "РегистрыНакопления.АТХ_ПартииНоменклатурыДляРемонтовТверь_НД");
//доработка }
ПроведениеДокументовЛокализация.ДополнитьУчетныеМеханизмыКонфигурации(МеханизмыКонфигурации);
Возврат МеханизмыКонфигурации;
КонецФункции
Здесь в качестве значения механизма берется РегистрыНакопления.АТХ_ПартииНоменклатурыДляРемонтовТверь_НД, что означает расположение механизма в модуле менеджера данного регистра накопления. (для более сложного случая добавляется общий модуль механизма конфигурации, как показано в публикации № 1343740)
Чтобы не выносить себе мозги структурой модуля менеджера АТХ_ПартииНоменклатурыДляРемонтовТверь_НД, копируем в него содержимое подобного модуля менеджера из другого механизма конфигурации ФинансовыйРезультат (РегистрыНакопления.ФинансовыеРезультаты) и заменяем там обращение к регистру накопления ФинансовыеРезультаты на обращение к регистру накопления АТХ_ПартииНоменклатурыДляРемонтовТверь_НД. Получается в итоге следующий результат:
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
#Область ПрограммныйИнтерфейс
#Область Проведение
// Формирует параметры для проведения документа по регистрам учетного механизма через общий механизм проведения.
//
// Параметры:
// Документ - ДокументОбъект - записываемый документ
// Свойства - См. ПроведениеДокументов.СвойстваДокумента
//
// Возвращаемое значение:
// Структура - См. ПроведениеДокументов.ПараметрыУчетногоМеханизма
//
Функция ПараметрыДляПроведенияДокумента(Документ, Свойства) Экспорт
Параметры = ПроведениеДокументов.ПараметрыУчетногоМеханизма();
// Проведение
Если Свойства.РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
Параметры.ПодчиненныеРегистры.Добавить(Метаданные.РегистрыНакопления.АТХ_ПартииНоменклатурыДляРемонтовТверь_НД);
КонецЕсли;
// Контроль
Если Свойства.РежимЗаписи <> РежимЗаписиДокумента.Запись Тогда
Параметры.КонтрольныеРегистрыЗаданий.Добавить(Метаданные.РегистрыНакопления.АТХ_ПартииНоменклатурыДляРемонтовТверь_НД);
КонецЕсли;
Возврат Параметры;
КонецФункции
// Возвращает тексты запросов для сторнирования движений при исправлении документов
//
// Параметры:
// МетаданныеДокумента - ОбъектМетаданныхДокумент - Метаданные документа, который проводится.
//
// Возвращаемое значение:
// Соответствие - Соответствие полного имени регистра тексту запроса сторнирования
//
Функция ТекстыЗапросовСторнирования(МетаданныеДокумента) Экспорт
ДвиженияДокумента = МетаданныеДокумента.Движения;
ТекстыЗапросов = Новый Соответствие();
МетаданныеРегистра = Метаданные.РегистрыНакопления.АТХ_ПартииНоменклатурыДляРемонтовТверь_НД;
Если ДвиженияДокумента.Содержит(МетаданныеРегистра) Тогда
ТекстДопУсловий = "";
ТекстыЗапросов.Вставить(МетаданныеРегистра.ПолноеИмя(),
ПроведениеДокументов.ТекстСторнирующегоЗапроса(
МетаданныеРегистра,
МетаданныеДокумента,
ТекстДопУсловий));
КонецЕсли;
Возврат ТекстыЗапросов;
КонецФункции
// Процедура формирования движений по регистру.
//
// Параметры:
// ТаблицыДляДвижений - Структура - таблицы данных документа
// Движения - КоллекцияДвижений - коллекция наборов записей движений документа
// Отказ - Булево - признак отказа от проведения документа.
//
Процедура ОтразитьДвижения(ТаблицыДляДвижений, Движения, Отказ) Экспорт
Если Отказ Тогда
Возврат;
КонецЕсли;
ПроведениеДокументов.ОтразитьДвижения(ТаблицыДляДвижений, Движения, "АТХ_ПартииНоменклатурыДляРемонтовТверь_НД");
КонецПроцедуры
// Дополняет текст запроса механизма проверки даты запрета по таблице изменений.
//
// Параметры:
// Запрос - Запрос - используется для установки параметров запроса.
//
// Возвращаемое значение:
// Соответствие - соответствие имен таблиц изменения регистров и текстов запросов.
//
Функция ТекстыЗапросовКонтрольДатыЗапретаПоТаблицеИзменений(Запрос) Экспорт
СоответствиеТекстовЗапросов = Новый Соответствие();
Возврат СоответствиеТекстовЗапросов;
КонецФункции
#КонецОбласти
#Область ДляВызоваИзДругихПодсистем
// СтандартныеПодсистемы.УправлениеДоступом
// См. УправлениеДоступомПереопределяемый.ПриЗаполненииСписковСОграничениемДоступа.
Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт
Ограничение.Текст =
"РазрешитьЧтениеИзменение
|ГДЕ
| ЗначениеРазрешено(Организация)";
КонецПроцедуры
// Конец СтандартныеПодсистемы.УправлениеДоступом
#КонецОбласти
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#Область ОбновлениеИнформационнойБазы
// см. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления
Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт
КонецПроцедуры
// Параметры:
// Параметры - см. ОбновлениеИнформационнойБазы.ОсновныеПараметрыОтметкиКОбработке
//
Процедура ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию(Параметры) Экспорт
КонецПроцедуры
Процедура ОбработатьДанныеДляПереходаНаНовуюВерсию(Параметры) Экспорт
КонецПроцедуры
#КонецОбласти
#КонецОбласти
#КонецЕсли
Теперь для документа ПриобретениеТоваровУслуг надо указать, что будет использоваться новый механизм конфигурации АТХ_ПартииНоменклатурыДляРемонтовТверь_НД.
Сначала в модуле менеджера документа находим процедуру ЗарегистрироватьУчетныеМеханизмы и добавляем туда наш новый учетный механизм АТХ_ПартииНоменклатурыДляРемонтовТверь_НД:
Процедура ЗарегистрироватьУчетныеМеханизмы(МеханизмыДокумента) Экспорт
МеханизмыДокумента.Добавить("Взаиморасчеты");
МеханизмыДокумента.Добавить("Закупки");
//++ НЕ УТКА
МеханизмыДокумента.Добавить("МеждународныйУчет");
//-- НЕ УТКА
МеханизмыДокумента.Добавить("Обеспечение");
МеханизмыДокумента.Добавить("ОборотныеРегистрыУправленческогоУчета");
МеханизмыДокумента.Добавить("ОперативныйУчетТоваровОрганизаций");
МеханизмыДокумента.Добавить("ПриемНаОтветхранение");
МеханизмыДокумента.Добавить("ОформлениеОтчетовКомитентуОЗакупках");
МеханизмыДокумента.Добавить("РасчетыСПодотчетниками");
МеханизмыДокумента.Добавить("РеестрДокументов");
МеханизмыДокумента.Добавить("СебестоимостьИПартионныйУчет");
МеханизмыДокумента.Добавить("СерийныйУчет");
МеханизмыДокумента.Добавить("СуммыДокументовВВалютахУчета");
МеханизмыДокумента.Добавить("АдресныйСклад");
МеханизмыДокумента.Добавить("УчетДоходовРасходов");
МеханизмыДокумента.Добавить("УчетНДС");
МеханизмыДокумента.Добавить("УчетПрочихАктивовПассивов");
МеханизмыДокумента.Добавить("УчетРабот");
МеханизмыДокумента.Добавить("ЦеныИСкидки");
//доработка {
МеханизмыДокумента.Добавить("АТХ_ПартииНоменклатурыДляРемонтовТверь_НД");
//доработка }
ПриобретениеТоваровУслугЛокализация.ЗарегистрироватьУчетныеМеханизмы(МеханизмыДокумента);
КонецПроцедуры
После этого в модуле менеджера документа находим функцию ДанныеДокументаДляПроведения и добавляем туда текст запроса для проведения по регистру АТХ_ПартииНоменклатурыДляРемонтовТверь_НД:
Документы.ПриобретениеТоваровУслуг.МодульМенеджера.Функция ДанныеДокументаДляПроведения
Функция ДанныеДокументаДляПроведения(Документ, Регистры, ДопПараметры = Неопределено) Экспорт
Если ДопПараметры = Неопределено Тогда
ДопПараметры = ПроведениеДокументов.ДопПараметрыИнициализироватьДанныеДокументаДляПроведения();
КонецЕсли;
Запрос = Новый Запрос;
ТекстыЗапроса = Новый СписокЗначений;
Если Не ДопПараметры.ПолучитьТекстыЗапроса Тогда
////////////////////////////////////////////////////////////////////////////
// Создадим запрос инициализации движений
ЗаполнитьПараметрыИнициализации(Запрос, Документ);
////////////////////////////////////////////////////////////////////////////
// Сформируем текст запроса
СформироватьСуммыДокументаВВалютахУчета(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаЗаказыПоставщикам(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаДвиженияСерийТоваров(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаЦеныНоменклатурыПоставщиков(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаПринятаяВозвратнаяТара(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаДатыПоступленияТоваровОрганизаций(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаТоварыОрганизаций(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаТоварыКОформлениюДокументовИмпорта(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаСебестоимостьТоваров(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаПрочиеРасходы(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаДенежныеСредстваУПодотчетныхЛиц(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаПартииТоваровОрганизаций(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаМатериалыИРаботыВПроизводстве(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаПартииПроизводственныхЗатрат(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаПартииПрочихРасходов(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаЗакупки(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаДвиженияКонтрагентДоходыРасходы(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаДвиженияДенежныеСредстваДоходыРасходы(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаРеестрДокументов(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаПрочиеАктивыПассивы(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаТоварыУслугиКОформлениюОтчетовКомитентуОЗакупках(Запрос, ТекстыЗапроса, Регистры);
РасчетСебестоимостиПроведениеДокументов.ОтразитьВМеханизмеУчетаЗатратИСебестоимости(Документ, Запрос, ТекстыЗапроса, Регистры);
ОтразитьВУчетеНДС(Запрос, ТекстыЗапроса, Регистры);
//доработка {
ТекстЗапросаТаблицаАТХ_ПартииНоменклатурыДляРемонтовТверь_НД(Запрос, ТекстыЗапроса, Регистры);
//доработка }
КонецЕсли;
ОтразитьРаспределениеЗапасовДвижения(Запрос, ТекстыЗапроса, Регистры);
ДобавитьТекстыОтраженияВзаиморасчетов(Запрос, ТекстыЗапроса, Регистры);
ЗапланироватьПоступлениеТоваров(Запрос, ТекстыЗапроса, Регистры);
ОформитьПоступлениеТоваровПоОдноходовке(Запрос, ТекстыЗапроса, Регистры);
ОформитьПриобретениеТоваровПоДвухходовке(Запрос, ТекстыЗапроса, Регистры);
ПриобретениеТоваровУслугЛокализация.ДополнитьТекстыЗапросовПроведения(Запрос, ТекстыЗапроса, Регистры);
////////////////////////////////////////////////////////////////////////////
// Получим таблицы для движений
Возврат ПроведениеДокументов.ИнициализироватьДанныеДокументаДляПроведения(Запрос, ТекстыЗапроса, ДопПараметры);
КонецФункции
//доработка {
Функция ТекстЗапросаТаблицаАТХ_ПартииНоменклатурыДляРемонтовТверь_НД(Запрос, ТекстыЗапроса, Регистры)
ИмяРегистра = "АТХ_ПартииНоменклатурыДляРемонтовТверь_НД";
ТекстЗапроса =
"ВЫБРАТЬ
| &Период КАК Период,
| ПриобретениеТоваровУслугТовары.АТХ_НД_Тверьэнерго КАК НаправлениеДеятельности,
| ПриобретениеТоваровУслугТовары.Ссылка КАК ПТУ,
| ПриобретениеТоваровУслугТовары.Номенклатура КАК Номенклатура,
| ПриобретениеТоваровУслугТовары.Цена КАК Цена,
| ПриобретениеТоваровУслугТовары.Количество КАК Количество
|ИЗ
| Документ.ПриобретениеТоваровУслуг.Товары КАК ПриобретениеТоваровУслугТовары
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АТХ_ВидТарифаТранспортныхСредств.СрезПоследних(&Период, ) КАК АТХ_ВидТарифаТранспортныхСредствСрезПоследних
| ПО ПриобретениеТоваровУслугТовары.АТХ_НД_Тверьэнерго = АТХ_ВидТарифаТранспортныхСредствСрезПоследних.НаправлениеДеятельности
|ГДЕ
| НЕ ПриобретениеТоваровУслугТовары.АТХ_НД_Тверьэнерго = ЗНАЧЕНИЕ(Справочник.НаправленияДеятельности.ПустаяСсылка)
| И ПриобретениеТоваровУслугТовары.Ссылка = &Ссылка
| И АТХ_ВидТарифаТранспортныхСредствСрезПоследних.ВидТарифа.Код = 63
| И &Период >= ДАТАВРЕМЯ(2021, 7, 1, 0, 0, 0)
| И НЕ АТХ_ВидТарифаТранспортныхСредствСрезПоследних.ВидТарифа ЕСТЬ NULL";
ТекстыЗапроса.Добавить(ТекстЗапроса, ИмяРегистра);
Возврат ТекстЗапроса;
КонецФункции
//доработка }
// в доработке в табличную часть Товары документа ПриобретениеТоваровУслуг добавлен
// реквизит АТХ_НД_Тверьэнерго (СправочникСсылка.НаправленияДеятельности)- автомобиль, на который покупаются запчасти
// А также добавлен регистр сведений АТХ_ВидТарифаТранспортныхСредств:
// Измерения:
// НаправлениеДеятельности (СправочникСсылка.НаправленияДеятельности)
// Ресурсы:
// ВидТарифа (СправочникСсылка.ВидыТарифов)
// справочник ВидыТарифов - также добавлен
Вот и всё. Приступаем к отладке проведения документа ПриобретениеТоваровУслуг.
Документы.ПриобретениеТоваровУслуг.МодульМенеджера.Функция ДанныеДокументаДляПроведения