Как использовать справочник из расширения в качестве субконто программно созданного счета

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

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

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

Выясняем причину: почему возникает ошибка?

В системе «1С:Предприятие» за субконто отвечает План видов характеристик (ПВХ) — обычно это предопределенный ПВХ ВидыСубконтоХозрасчетные. Тип значения характеристик этого ПВХ жестко определяет список типов данных, которые могут быть использованы в качестве аналитики на счетах бухгалтерского учета.

Когда мы создаем новый справочник в расширении, его тип данных (например, СправочникСсылка.Расш_МойНовыйСправочник) отсутствует в типе значения характеристик основного ПВХ конфигурации. На старых режимах совместимости (ниже 8.3.20) платформа запрещает расширять составной тип значений ПВХ объектами из расширения. При попытке назначить такой тип субконто система справедливо сообщает о нарушении целостности метаданных.

Давайте разберем три основных метода решения этой задачи: от классического «обходного пути» для старых платформ до современных возможностей актуальных релизов 1С.

---

Способ 1. Использование справочника-«прокладки» (Решение для режима совместимости < 8.3.20)

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

В типовой конфигурации «1С:Бухгалтерия» изначально присутствует предопределенный справочник Субконто. Он по умолчанию включен в тип значений характеристик ПВХ ВидыСубконтоХозрасчетные. Мы можем использовать его в качестве контейнера для хранения ссылок на наш новый справочник из расширения.

Разберем реализацию этого метода по шагам:

  1. Заимствование справочника: Добавьте (заимствуйте) типовой справочник Субконто в свое расширение.
  2. Добавление реквизита: В расширении добавьте к заимствованному справочнику Субконто новый реквизит, например, Расш_СсылкаНаОбъект. Установите для него тип вашего нового справочника из расширения (СправочникСсылка.Расш_МойНовыйСправочник).
  3. Создание субконто: При программном создании счета или назначении аналитики мы используем вид субконто, связанный со справочником Субконто.
  4. Программное заполнение данных: При записи движений по счету мы сначала программно создаем (или находим существующий) элемент справочника Субконто, записываем в наш реквизит Расш_СсылкаНаОбъект ссылку на реальный элемент нового справочника и уже этот элемент Субконто подставляем в проводку.

Для того чтобы пользователи в отчетах (оборотно-сальдовая ведомость, карточка счета) видели не безликие элементы справочника «Субконто», а реальные наименования вашего справочника, необходимо перехватить получение представления. Для этого в модуле менеджера заимствованного справочника Субконто в расширении напишем следующий код:


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

Также рекомендуется переопределить событие ПередЗаписью справочника Субконто, чтобы автоматически синхронизировать наименование для стандартных поисковых механизмов:


&Перед("ПередЗаписью")
Процедура Расш_ПередЗаписью(Отказ)
    
    Если ЗначениеЗаполнено(ЭтотОбъект.Расш_СсылкаНаОбъект) Тогда
        ЭтотОбъект.Наименование = Лев(Строка(ЭтотОбъект.Расш_СсылкаНаОбъект), 150);
    КонецЕсли;
    
КонецПроцедуры

---

Способ 2. Прямое расширение ПВХ (Решение для современных платформ 8.3.20+)

Если у вас есть возможность обновить платформу «1С:Предприятие» до версии 8.3.20 и выше, а также поднять режим совместимости конфигурации, то проблема решается штатными средствами без каких-либо «костылей».

Начиная с версии платформы 8.3.20, разработчикам официально разрешено расширять свойство «Тип значения характеристик» у заимствованных Планов видов характеристик. Рассмотрим этот процесс:

  1. Заимствуйте План видов характеристик ВидыСубконтоХозрасчетные в расширение.
  2. Откройте свойства заимствованного ПВХ в расширении.
  3. Найдите свойство Тип значения характеристик и откройте редактор состава типов.
  4. В списке типов вы без труда обнаружите ваш собственный справочник, созданный в расширении. Просто установите напротив него флаг.

После этого ваш справочник станет полноправным типом для использования в качестве субконто. Вы сможете программно добавлять новые виды субконто и привязывать их к любым счетам.

---

Способ 3. Переход от регистра бухгалтерии к регистрам накопления

Проанализируем архитектурную сторону вопроса. Часто программисты, переносящие код из старых версий (например, 1С 7.7), по привычке пытаются реализовать любой дополнительный учет через забалансовые счета регистра бухгалтерии. Однако в среде 1С 8.3 это не всегда оптимально.

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

Важное ограничение: Возможность добавлять собственные регистры накопления в расширения появилась в платформе начиная с версии 8.3.13. Если режим совместимости вашей базы равен 8.3.12 или ниже, платформа не позволит обновить конфигурацию базы данных с регистром накопления в расширении.

Если же режим совместимости позволяет (8.3.13+), то создание регистра — это самый «чистый» способ:

Резюме

Для решения проблемы с субконто из расширения выберите один из путей в зависимости от вашего ИТ-ландшафта:

← На главную