Как создать документ с кастомной формой и исключить его из обмена РИБ

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Управленческий учет IT и автоматизация бизнеса
← На главную

При работе с типовыми конфигурациями, такими как 1С:Бухгалтерия 3.0, часто возникает задача создания специфического функционала, который не должен влиять на работу периферийных узлов в распределенной информационной базе (РИБ). Рассмотрим ситуацию, когда нам необходимо на базе типовой «Реализации товаров и услуг» создать документ с особой формой, данные которого должны оставаться только в центральном узле.

Разберем, почему простое копирование документа в расширение является плохой практикой и как реализовать задачу элегантно, сохранив поддержку и целостность базы данных.

Почему не стоит копировать типовой документ в расширение

Проанализируем риски, связанные с созданием полной копии документа РеализацияТоваровУслуг. При копировании сложного объекта метаданных мы сталкиваемся со следующими проблемами:

  1. Подписки на события: Типовой документ участвует в десятках подписок на события (проведение, заполнение, префиксация). Копия не будет подхвачена этими механизмами автоматически, и вам придется вручную расширять каждую подписку.
  2. Определяемые типы: В конфигурации множество определяемых типов (например, ОснованиеДокументаОбъекта), куда включена типовая реализация. Копия там отсутствовать не будет, что приведет к невозможности создания связанных документов (счетов-фактур, актов сверки и т.д.).
  3. Регистры и движения: Придется вручную прописывать движения по всем регистрам бухгалтерии и накопления, что крайне трудозатратно и чревато ошибками при обновлениях.

Вместо этого мы рассмотрим путь модификации существующего объекта через механизмы расширений и правил обмена.

Шаг 1. Добавление признака фильтрации

Выясним, как пометить документ, чтобы система «понимала», что он является особенным и не должен уезжать в периферийные базы. Самый надежный способ — добавить в документ РеализацияТоваровУслуг новый реквизит через расширение.

Добавим реквизит ВариантРеализации (тип Булево или Перечисление). Если флаг установлен, документ считается «внутренним» или «особым».

Рассмотрим пример кода в модуле объекта (через расширение) для автоматической установки этого признака или проверки условий:


&Перед("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    Если ЭтоНовый() И Расш1_НужнаОсобаяФорма Тогда
        ЭтотОбъект.Расш1_НеВыгружатьВРИБ = Истина;
    КонецЕсли;
КонецПроцедуры

Шаг 2. Настройка правил регистрации в РИБ

Проанализируем процесс обмена данными. Чтобы документ не попал в сообщение обмена, необходимо вмешаться в механизм регистрации объектов. В БСП (Библиотеке стандартных подсистем) это реализуется через изменение правил регистрации объектов (ПРО) или через программный фильтр в модуле менеджера обмена.

Посмотрим на пример реализации фильтрации в расширении модуля менеджера плана обмена. Нам нужно перехватить процедуру ПриОпределенииПунктовНазначения:


&После("ПриОпределенииПунктовНазначения")
Процедура Расш1_ПриОпределенииПунктовНазначения(Объект, ПунктыНазначения)
    // Если у документа установлен наш флаг, очищаем список узлов-получателей
    Если ТипЗнч(Объект) = Тип("ДокументОбъект.РеализацияТоваровУслуг") Тогда
        Если Объект.Расш1_НеВыгружатьВРИБ Тогда
            ПунктыНазначения.Очистить();
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Важный момент: если пользователь сначала записал документ как обычный (он уехал в РИБ), а потом поставил флаг «не выгружать», объект останется в периферийной базе. В таком случае логика должна быть сложнее: нужно регистрировать УдалениеОбъекта для этого узла.

Шаг 3. Подмена формы документа

Теперь разберем, как реализовать кастомный интерфейс для такого документа. Нам не нужно менять стандартную форму, мы создадим в расширении новую форму и назначим ее программно.

Для этого в модуле менеджера документа используем обработчик ОбработкаПолученияФормы. Это позволит нам гибко подставлять нужную форму в зависимости от контекста.


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

Этот метод гарантирует, что при открытии документа из любого списка или по ссылке, система проверит наш признак и откроет именно вашу кастомную форму.

Шаг 4. Учет движений и регистров

Проанализируем ситуацию с регистрами. Даже если сам документ не передается в периферийную базу, он делает записи в РегистрБухгалтерии.Хозрасчетный или РегистрНакопления.ТоварыНаСкладах. Если в настройках РИБ включена миграция этих регистров «по регистратору», то записи документа также не уйдут, так как сам регистратор не выгружается.

Однако будьте осторожны: если в вашей базе настроена миграция итогов или детальных записей регистров независимо от документов, данные о суммах реализации могут попасть в отчеты на периферии, что приведет к расхождениям. Рекомендуем проверить правила выгрузки для всех регистров, по которым делает движения РеализацияТоваровУслуг.

Альтернативный подход: Дополнительные реквизиты БСП

Если вы опасаетесь вносить изменения в структуру таблиц (добавлять реальные реквизиты), можно рассмотреть использование механизма «Дополнительные реквизиты и сведения».

В этом случае алгоритм будет следующим:

Риски «битых ссылок»

Разберем критически важный аспект. Если вы создаете «скрытый» документ, на него не должны ссылаться объекты, которые выгружаются в РИБ. Например, если вы создадите «Счет-фактуру» на основании такой «особой» реализации и попытаетесь выгрузить эту счет-фактуру, на периферии возникнет ошибка Объект не найден (битая ссылка) в поле документа-основания.

Рекомендация: программно запрещайте ввод на основании «особых» документов тех объектов, которые участвуют в обмене, либо также помечайте их признаком «не участвует в РИБ».

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

← На главную