При работе с механизмами расширений в платформе 1С:Предприятие 8.3 разработчики часто сталкиваются с неожиданным поведением системы, особенно если основная конфигурация находится в режиме совместимости предыдущих версий. Одной из наиболее труднообъяснимых ошибок является сбой при попытке сохранить расширение, содержащее новый оборотный регистр накопления. При сохранении изменений система выдает критическую ошибку: «Требуемая операция не может быть выполнена, т.к. установлены не все разделители ИБ».
Примечательно, что аналогичные новые регистры накопления с видом «Остатки» добавляются в это же расширение абсолютно беспрепятственно. В этой статье мы подробно проанализируем, почему возникает данный сбой, как устроена работа СУБД с разделителями данных на уровне платформы и какими практическими способами можно решить или обойти эту проблему.
Данная ошибка напрямую связана с механизмом разделения данных (мультиарендность), который активно применяется в облачных технологиях (например, в модели сервиса 1С:Fresh). В типовых конфигурациях 1С, разработанных на базе Библиотеки стандартных подсистем (БСП) — таких как «Управление торговлей 11», «ERP Управление предприятием» или «Комплексная автоматизация», — по умолчанию присутствуют общие реквизиты-разделители. Самыми распространенными из них являются ОбластьДанныхОсновныеДанные и ОбластьДанныхВспомогательныеДанные.
Даже если ваша информационная база развернута локально и не использует разделение на уровне пользователей, физическая структура таблиц в СУБД (MS SQL Server, PostgreSQL и др.) все равно создается с учетом этих разделителей. При обновлении конфигурации или обновлении базы данных с расширением платформа выполняет реструктуризацию таблиц.
В режиме совместимости 8.3.10 механизм работы с расширениями содержит платформенное ограничение (баг) в модуле реструктуризации таблиц для разделенных баз данных:
Давайте рассмотрим подробнее, какими способами мы можем решить эту проблему на практике.
---
Полноценная поддержка оборотных регистров накопления с агрегатами и без в механизме расширений для разделенных баз данных была реализована разработчиками 1С только начиная с версии платформы 8.3.12. С этого момента в платформу было добавлено свойство «Разделение расширений конфигурации», условное разделение и обновленная логика реструктуризации.
Если у вас есть возможность изменить режим совместимости основной конфигурации, выполните следующие шаги:
РежимСовместимости.Важное примечание: Если вы работаете с типовой конфигурацией (например, «1С:Управление торговлей»), изменение режима совместимости может потребовать детального тестирования всей системы, так как многие внутренние механизмы БСП завязаны на поведение конкретной версии совместимости. Если этот способ вам не подходит, переходите к альтернативным вариантам ниже.
---
Если бизнес-логика вашей задачи требует накопления и анализа оборотных данных, но режим совместимости изменить нельзя, самым стабильным решением будет отказ от использования оборотного регистра накопления в пользу периодического Регистра сведений.
Регистры сведений не имеют таблиц итогов и оборотов в СУБД, поэтому они не вызывают конфликтов реструктуризации при работе с разделителями в режиме совместимости 8.3.10.
Рассмотрим, как спроектировать такое решение:
РегистрСведений.Периодичность (например, «В пределах секунды» или «Позиция регистратора»).При получении оборотных данных вместо виртуальной таблицы Обороты регистра накопления мы будем использовать запрос к регистру сведений с группировкой по периоду и измерениям. Разберем пример кода для получения данных:
// Пример запроса для получения "оборотов" из подчиненного регистра сведений в расширении
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПродажиИзРасширения.Номенклатура КАК Номенклатура,
| СУММА(ПродажиИзРасширения.Количество) КАК КоличествоОборот,
| СУММА(ПродажиИзРасширения.Сумма) КАК СуммаОборот
|ИЗ
| РегистрСведений.ПродажиИзРасширения КАК ПродажиИзРасширения
|ГДЕ
| ПродажиИзРасширения.Период МЕЖДУ &НачалоПериода И &КонецПериода
|ГРУППИРОВАТЬ ПО
| ПродажиИзРасширения.Номенклатура";
Запрос.УстановитьПараметр("НачалоПериода", НачалоДня(ТекущаяДата()));
Запрос.УстановитьПараметр("КонецПериода", КонецДня(ТекущаяДата()));
РезультатЗапроса = Запрос.Выполнить();
---
Если архитектура решения жестко требует использования именно регистров накопления (например, если логика проведения документов завязана на универсальные механизмы проведения по регистрам накопления), вы можете создать Регистр накопления с видом «Остатки».
Как мы уже выяснили, регистры остатков успешно добавляются в расширение в режиме совместимости 8.3.10. Мы можем использовать этот регистр как оборотный, применив следующую хитрость:
РегистрНакопления с видом «Остатки».Проанализируем пример запроса для получения чистых оборотов по такому регистру за период:
// Получаем обороты по регистру остатков через таблицу движений (Обороты)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДвиженияРегистра.Номенклатура КАК Номенклатура,
| СУММА(ДвиженияРегистра.Количество) КАК КоличествоОборот
|ИЗ
| РегистрНакопления.ДвиженияТоваровРасширение КАК ДвиженияРегистра
|ГДЕ
| ДвиженияРегистра.Период МЕЖДУ &НачалоПериода И &КонецПериода
| И ДвиженияРегистра.Активность = ИСТИНА
|ГРУППИРОВАТЬ ПО
| ДвиженияРегистра.Номенклатура";
Запрос.УстановитьПараметр("НачалоПериода", Объект.ДатаНачала);
Запрос.УстановитьПараметр("КонецПериода", Объект.ДатаОкончания);
Результат = Запрос.Выполнить();
Используя этот подход, вы избежите ошибки СУБД с разделителями данных при сохранении расширения, сохранив привычную объектную технику проведения документов по регистрам накопления.
---
Иногда ошибка «Установлены не все разделители ИБ» возникает спорадически при накатывании обновлений основной конфигурации, в то время как расширение уже создано и успешно работало ранее. Это связано с тем, что при изменении состава разделителей в основной конфигурации платформа пытается перестроить таблицы расширений в неинициализированном сеансе.
В такой ситуации официальная техподдержка 1С рекомендует выполнить следующий алгоритм действий:
.cfe)..cfe.---
Мы подробно разобрали причины возникновения ошибки «Установлены не все разделители ИБ» при добавлении оборотных регистров накопления в расширение на платформе 1С 8.3. Подводя итоги, дадим несколько ключевых рекомендаций: