Как исправить ошибку «Установлены не все разделители ИБ» при добавлении оборотного регистра накопления в расширение 1С?

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

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

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

Почему возникает ошибка? Разбираем техническую суть проблемы

Данная ошибка напрямую связана с механизмом разделения данных (мультиарендность), который активно применяется в облачных технологиях (например, в модели сервиса 1С:Fresh). В типовых конфигурациях 1С, разработанных на базе Библиотеки стандартных подсистем (БСП) — таких как «Управление торговлей 11», «ERP Управление предприятием» или «Комплексная автоматизация», — по умолчанию присутствуют общие реквизиты-разделители. Самыми распространенными из них являются ОбластьДанныхОсновныеДанные и ОбластьДанныхВспомогательныеДанные.

Даже если ваша информационная база развернута локально и не использует разделение на уровне пользователей, физическая структура таблиц в СУБД (MS SQL Server, PostgreSQL и др.) все равно создается с учетом этих разделителей. При обновлении конфигурации или обновлении базы данных с расширением платформа выполняет реструктуризацию таблиц.

В режиме совместимости 8.3.10 механизм работы с расширениями содержит платформенное ограничение (баг) в модуле реструктуризации таблиц для разделенных баз данных:

  1. Регистры остатков при создании в СУБД формируют таблицы движений и таблицы итогов. Платформа 1С в режиме совместимости 8.3.10 корректно обрабатывает их реструктуризацию и связывает новые таблицы с общими реквизитами-разделителями основной конфигурации.
  2. Оборотные регистры накопления имеют другую структуру. На уровне СУБД они создают таблицу движений и таблицу оборотов. При попытке сохранить оборотный регистр накопления в расширении платформа не может корректно сопоставить таблицу оборотов с общими реквизитами-разделителями конфигурации. В результате СУБД пытается создать подчиненные таблицы без учета структуры разделителей, что вызывает конфликт прав доступа к таблицам и аварийную остановку процесса реструктуризации с выдачей ошибки о разделителях.

Давайте рассмотрим подробнее, какими способами мы можем решить эту проблему на практике.

---

Способ 1. Изменение режима совместимости конфигурации (Рекомендуемый)

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

Если у вас есть возможность изменить режим совместимости основной конфигурации, выполните следующие шаги:

  1. Откройте основную конфигурацию в режиме Конфигуратор.
  2. В свойствах корневого объекта конфигурации найдите свойство РежимСовместимости.
  3. Установите значение свойства в «Не использовать» или выберите версию «8.3.12» (или выше, в зависимости от требований вашей версии платформы).
  4. Аналогично откройте свойства вашего расширения и установите его режим совместимости в соответствие с основной конфигурацией.
  5. Выполните обновление конфигурации базы данных (клавиша F7).

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

---

Способ 2. Обходной путь через использование Регистров сведений

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

Регистры сведений не имеют таблиц итогов и оборотов в СУБД, поэтому они не вызывают конфликтов реструктуризации при работе с разделителями в режиме совместимости 8.3.10.

Рассмотрим, как спроектировать такое решение:

  1. Создайте в расширении новый РегистрСведений.
  2. Установите для него свойство Периодичность (например, «В пределах секунды» или «Позиция регистратора»).
  3. Установите режим записи «Подчинение регистратору».
  4. Перенесите структуру измерений и ресурсов из планируемого оборотного регистра накопления в созданный регистр сведений.

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


// Пример запроса для получения "оборотов" из подчиненного регистра сведений в расширении
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ПродажиИзРасширения.Номенклатура КАК Номенклатура,
    |	СУММА(ПродажиИзРасширения.Количество) КАК КоличествоОборот,
    |	СУММА(ПродажиИзРасширения.Сумма) КАК СуммаОборот
    |ИЗ
    |	РегистрСведений.ПродажиИзРасширения КАК ПродажиИзРасширения
    |ГДЕ
    |	ПродажиИзРасширения.Период МЕЖДУ &НачалоПериода И &КонецПериода
    |ГРУППИРОВАТЬ ПО
    |	ПродажиИзРасширения.Номенклатура";

Запрос.УстановитьПараметр("НачалоПериода", НачалоДня(ТекущаяДата()));
Запрос.УстановитьПараметр("КонецПериода", КонецДня(ТекущаяДата()));
РезультатЗапроса = Запрос.Выполнить();

---

Способ 3. Обходной путь через использование Регистров остатков

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

Как мы уже выяснили, регистры остатков успешно добавляются в расширение в режиме совместимости 8.3.10. Мы можем использовать этот регистр как оборотный, применив следующую хитрость:

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

Проанализируем пример запроса для получения чистых оборотов по такому регистру за период:


// Получаем обороты по регистру остатков через таблицу движений (Обороты)
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ДвиженияРегистра.Номенклатура КАК Номенклатура,
    |	СУММА(ДвиженияРегистра.Количество) КАК КоличествоОборот
    |ИЗ
    |	РегистрНакопления.ДвиженияТоваровРасширение КАК ДвиженияРегистра
    |ГДЕ
    |	ДвиженияРегистра.Период МЕЖДУ &НачалоПериода И &КонецПериода
    |	И ДвиженияРегистра.Активность = ИСТИНА
    |ГРУППИРОВАТЬ ПО
    |	ДвиженияРегистра.Номенклатура";

Запрос.УстановитьПараметр("НачалоПериода", Объект.ДатаНачала);
Запрос.УстановитьПараметр("КонецПериода", Объект.ДатаОкончания);
Результат = Запрос.Выполнить();

Используя этот подход, вы избежите ошибки СУБД с разделителями данных при сохранении расширения, сохранив привычную объектную технику проведения документов по регистрам накопления.

---

Способ 4. Временное отключение/удаление расширения при обновлении

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

В такой ситуации официальная техподдержка 1С рекомендует выполнить следующий алгоритм действий:

  1. Перед проведением обновления основной базы данных зайдите в меню Конфигурация — Расширения конфигурации.
  2. Выделите ваше расширение и выполните команду Сохранить расширение в файл... (создайте резервную копию расширения в формате .cfe).
  3. Удалите расширение из списка расширений в конфигураторе.
  4. Выполните обновление и реструктуризацию основной конфигурации (F7), примените все изменения базы данных.
  5. Снова зайдите в список расширений, добавьте новое пустое расширение и выполните команду Загрузить расширение из файла..., выбрав сохраненный ранее файл .cfe.
  6. Повторно примените изменения базы данных. В большинстве случаев повторная инициализация таблиц проходит успешно, без возникновения ошибок разделения данных.

---

Выводы и рекомендации

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

← На главную