При работе с типовыми конфигурациями, такими как 1С:Бухгалтерия 3.0, часто возникает задача создания специфического функционала, который не должен влиять на работу периферийных узлов в распределенной информационной базе (РИБ). Рассмотрим ситуацию, когда нам необходимо на базе типовой «Реализации товаров и услуг» создать документ с особой формой, данные которого должны оставаться только в центральном узле.
Разберем, почему простое копирование документа в расширение является плохой практикой и как реализовать задачу элегантно, сохранив поддержку и целостность базы данных.
Проанализируем риски, связанные с созданием полной копии документа РеализацияТоваровУслуг. При копировании сложного объекта метаданных мы сталкиваемся со следующими проблемами:
ОснованиеДокументаОбъекта), куда включена типовая реализация. Копия там отсутствовать не будет, что приведет к невозможности создания связанных документов (счетов-фактур, актов сверки и т.д.).Вместо этого мы рассмотрим путь модификации существующего объекта через механизмы расширений и правил обмена.
Выясним, как пометить документ, чтобы система «понимала», что он является особенным и не должен уезжать в периферийные базы. Самый надежный способ — добавить в документ РеализацияТоваровУслуг новый реквизит через расширение.
Добавим реквизит ВариантРеализации (тип Булево или Перечисление). Если флаг установлен, документ считается «внутренним» или «особым».
Рассмотрим пример кода в модуле объекта (через расширение) для автоматической установки этого признака или проверки условий:
&Перед("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если ЭтоНовый() И Расш1_НужнаОсобаяФорма Тогда
ЭтотОбъект.Расш1_НеВыгружатьВРИБ = Истина;
КонецЕсли;
КонецПроцедуры
Проанализируем процесс обмена данными. Чтобы документ не попал в сообщение обмена, необходимо вмешаться в механизм регистрации объектов. В БСП (Библиотеке стандартных подсистем) это реализуется через изменение правил регистрации объектов (ПРО) или через программный фильтр в модуле менеджера обмена.
Посмотрим на пример реализации фильтрации в расширении модуля менеджера плана обмена. Нам нужно перехватить процедуру ПриОпределенииПунктовНазначения:
&После("ПриОпределенииПунктовНазначения")
Процедура Расш1_ПриОпределенииПунктовНазначения(Объект, ПунктыНазначения)
// Если у документа установлен наш флаг, очищаем список узлов-получателей
Если ТипЗнч(Объект) = Тип("ДокументОбъект.РеализацияТоваровУслуг") Тогда
Если Объект.Расш1_НеВыгружатьВРИБ Тогда
ПунктыНазначения.Очистить();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Важный момент: если пользователь сначала записал документ как обычный (он уехал в РИБ), а потом поставил флаг «не выгружать», объект останется в периферийной базе. В таком случае логика должна быть сложнее: нужно регистрировать УдалениеОбъекта для этого узла.
Теперь разберем, как реализовать кастомный интерфейс для такого документа. Нам не нужно менять стандартную форму, мы создадим в расширении новую форму и назначим ее программно.
Для этого в модуле менеджера документа используем обработчик ОбработкаПолученияФормы. Это позволит нам гибко подставлять нужную форму в зависимости от контекста.
&Вместо("ОбработкаПолученияФормы")
Процедура Расш1_ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)
// Проверяем, что запрашивается форма объекта
Если ВидФормы = "ФормаОбъекта" Тогда
// Если в параметрах передан ключ (существующий док)
Если Параметры.Свойство("Ключ") Тогда
ОбъектСсылка = Параметры.Ключ;
Если ОбъектСсылка.Расш1_НеВыгружатьВРИБ Тогда
ВыбраннаяФорма = "Документ.РеализацияТоваровУслуг.Форма.Расш1_ОсобаяФорма";
СтандартнаяОбработка = Ложь;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Этот метод гарантирует, что при открытии документа из любого списка или по ссылке, система проверит наш признак и откроет именно вашу кастомную форму.
Проанализируем ситуацию с регистрами. Даже если сам документ не передается в периферийную базу, он делает записи в РегистрБухгалтерии.Хозрасчетный или РегистрНакопления.ТоварыНаСкладах. Если в настройках РИБ включена миграция этих регистров «по регистратору», то записи документа также не уйдут, так как сам регистратор не выгружается.
Однако будьте осторожны: если в вашей базе настроена миграция итогов или детальных записей регистров независимо от документов, данные о суммах реализации могут попасть в отчеты на периферии, что приведет к расхождениям. Рекомендуем проверить правила выгрузки для всех регистров, по которым делает движения РеализацияТоваровУслуг.
Если вы опасаетесь вносить изменения в структуру таблиц (добавлять реальные реквизиты), можно рассмотреть использование механизма «Дополнительные реквизиты и сведения».
В этом случае алгоритм будет следующим:
Запрос или функции БСП.Разберем критически важный аспект. Если вы создаете «скрытый» документ, на него не должны ссылаться объекты, которые выгружаются в РИБ. Например, если вы создадите «Счет-фактуру» на основании такой «особой» реализации и попытаетесь выгрузить эту счет-фактуру, на периферии возникнет ошибка Объект не найден (битая ссылка) в поле документа-основания.
Рекомендация: программно запрещайте ввод на основании «особых» документов тех объектов, которые участвуют в обмене, либо также помечайте их признаком «не участвует в РИБ».
Подводя итог, мы видим, что использование расширений вместе с грамотной настройкой фильтрации регистрации — это наиболее стабильный путь, который сохраняет возможность типового обновления конфигурации и обеспечивает выполнение всех требований ТЗ.