Почему расширение для 1С:Фреш не проходит аудит при изменении структуры данных и как это исправить?

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

Разработка расширений для облачных решений, таких как 1С:Управление нашей фирмой (УНФ) в сервисе 1С:Фреш, существенно отличается от разработки для локальных баз (on-premise). Основная сложность заключается в строгом аудите, который проходят все расширения перед публикацией. Одной из самых частых ошибок является сообщение: «Конфигурация не поддерживает работу с расширениями, изменяющими структуру данных в модели сервиса». Проанализируем, почему это происходит и как реализовать необходимый функционал, не нарушая правил сервиса.

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

Рассмотрим ситуацию с технической стороны. Сервис 1С:Фреш работает по технологии SaaS (программное обеспечение как услуга), где в одной физической базе данных могут находиться данные тысяч различных клиентов (областей данных). Когда вы добавляете новый реквизит в табличную часть существующего документа (например, ЗаказПокупателя) через механизм расширения, платформа инициирует процесс реструктуризации таблицы в СУБД.

Для огромных таблиц, в которых хранятся записи всех пользователей сервиса, этот процесс может вызвать длительные блокировки и деградацию производительности всей системы. Именно поэтому администраторы сервиса часто блокируют возможность использования механизма Расширения данных (Data Extensions) для типовых объектов. Даже если в документации по платформе 1С:Предприятие указано, что это технически возможно, регламенты безопасности и стабильности 1С:Фреш накладывают свои коррективы.

Основные причины отказа в аудите при добавлении реквизитов в ТЧ:

  1. Реструктуризация тяжелых таблиц: Изменение структуры таблиц с миллионами строк недопустимо в режиме реального времени.
  2. Разделение данных: Не все объекты в расширениях могут корректно поддерживать автоматическое разделение по областям данных, что создает риск утечки информации между клиентами.
  3. Безопасный режим: Расширения в сервисе обязаны работать в безопасном режиме, который накладывает ограничения на использование определенных методов работы с данными.

Альтернативное решение: использование независимых регистров сведений

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

Проанализируем алгоритм работы:

  1. Создаем в расширении новый объект — Регистр сведений.
  2. В форму документа программно добавляем колонки, которые будут отображать данные из этого регистра.
  3. Программируем чтение данных при открытии формы и их запись при сохранении документа.

Шаг 1: Создание регистра в расширении

Создадим независимый регистр сведений, например, ДополнительныеДанныеТЧЗаказа. В качестве измерений будем использовать ссылку на документ и уникальный идентификатор строки, чтобы данные четко привязывались к конкретной позиции в табличной части.

Структура регистра:

Шаг 2: Программное добавление колонок на форму

В расширении формы документа ЗаказПокупателя в процедуре ПриСозданииНаСервере нам необходимо создать новые реквизиты формы и элементы управления (колонки в таблице). Рассмотрим пример кода:


&НаСервере
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    // Добавляем реквизиты в таблицу формы "Запасы" (имя ТЧ в УНФ)
    НовыеРеквизиты = Новый Массив;
    НовыеРеквизиты.Добавить(Новый РеквизитФормы("СтатусРабот", Новый ОписаниеТипов("ПеречислениеСсылка.Статусы"), "Объект.Запасы"));
    НовыеРеквизиты.Добавить(Новый РеквизитФормы("Зарплата", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2)), "Объект.Запасы"));
    
    ЭтаФорма.ИзменитьРеквизиты(НовыеРеквизиты);
    
    // Добавляем элементы (колонки) визуально на форму
    ЭлементТЧ = Элементы.Запасы;
    НоваяКолонка = Элементы.Добавить("ЗапасыСтатусРабот", Тип("ПолеФормы"), ЭлементТЧ);
    НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
    НоваяКолонка.ПутьКДанным = "Объект.Запасы.СтатусРабот";
    
    // Аналогично для Зарплаты...
КонецПроцедуры

Шаг 3: Чтение и запись данных

Теперь проанализируем ситуацию с сохранением данных. Нам нужно заполнить программно созданные колонки при открытии и выгрузить их в регистр при записи.

Для чтения данных в процедуре ПриЧтенииНаСервере выполним запрос к нашему регистру сведений и сопоставим данные со строками табличной части. Крайне важно использовать КлючСвязи или НомерСтроки (если строки не пересчитываются динамически) для точного позиционирования.

Для записи данных используем обработчик ПередЗаписьюНаСервере или ПослеЗаписиНаСервере. Посмотрим на логику сохранения:


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

Важные замечания по прохождению аудита

При использовании вышеописанного метода (через регистры), обратите внимание на следующие моменты, которые обязательно проверят аудиторы 1С:

  1. Безопасный режим: Убедитесь, что расширение не требует отключения безопасного режима. Работа с собственными регистрами расширения в нем разрешена.
  2. Профили безопасности: Если вы используете внешние компоненты или специфические вызовы, это может потребовать дополнительных разрешений. В нашем случае (регистр + форма) это не требуется.
  3. Имена объектов: Используйте уникальные префиксы для своих объектов (например, Расш1_), чтобы избежать конфликтов имен с будущими обновлениями типовой конфигурации.
  4. Оптимизация запросов: Чтение данных из регистра при открытии формы должно быть оптимизировано. Не делайте запросы в цикле, используйте один пакетный запрос для получения всех данных ТЧ.

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

← На главную