Почему двоичные данные из регистра расширения не сохраняются в ХДД S3 в 1С 8.3.27?

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

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

Для решения этой проблемы платформа 1С, начиная с версии 8.3.27, представила и активно развивает механизм хранилища двоичных данных (ХДД). Этот механизм позволяет выносить большие двоичные данные за пределы основной СУБД, используя внешние S3-совместимые хранилища, такие как Amazon S3, MinIO, Яндекс Object Storage или другие. Идея заключается в том, чтобы сделать процесс сохранения этих данных максимально прозрачным для разработчика: мы указываем реквизиту тип ХранилищеЗначения, ставим соответствующую "галку", и платформа должна сама позаботиться о размещении данных в ХДД S3, если их размер превышает определенный порог.

Однако, как показывает практика, при использовании расширений конфигурации для добавления новых объектов, этот механизм не всегда срабатывает ожидаемым образом. Мы рассмотрим случай, когда реквизит типа ХранилищеЗначения в регистре сведений, добавленном в расширение, отказывается сохранять данные в ХДД S3, в то время как идентичный регистр в основной конфигурации успешно выполняет эту задачу. Давайте вместе разберемся в причинах такого поведения и найдем возможные пути решения.

Суть проблемы: ХДД S3 и регистры расширений

Наш коллега, работающий с платформой 1С:Предприятие 8.3.27, столкнулся с затруднительной ситуацией. Он добавил новый регистр сведений в существующую конфигурацию посредством расширения. В этом регистре был создан реквизит с типом ХранилищеЗначения, предназначенный для хранения двоичных данных, таких как прикрепленные файлы. Ожидалось, что при записи данных в этот реквизит, они автоматически будут помещены в настроенное ХДД S3, согласно установленной настройке "сохранять в ХДД" как для самого регистра, так и для его реквизита.

Каково же было его удивление, когда выяснилось, что при записи в аналогичный регистр сведений, созданный непосредственно в основной конфигурации (с идентичными настройками и типом реквизита), данные успешно размещались в S3. В то же время, при работе с регистром из расширения, данные хоть и сохранялись, но оставались внутри основной информационной базы, а не выгружались во внешнее S3-хранилище. Это указывает на системное различие в поведении платформы при обработке объектов из основной конфигурации и объектов, добавленных через расширения, в контексте нового функционала ХДД S3.

Для того чтобы лучше понять контекст проблемы, проанализируем фрагмент кода, который был использован для записи данных. Этот код является стандартным для работы с ХранилищеЗначения и демонстрирует попытку сохранения двоичных данных, полученных из справочника присоединенных файлов:


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

Как мы видим, код достаточно прямолинеен: создается объект ДвоичныеДанные из файла, затем он оборачивается в ХранилищеЗначения и присваивается реквизиту ФайлХранилище записи регистра сведений. Ожидаемое поведение состоит в том, что при вызове метода Записать() платформа самостоятельно оценит размер хранимых данных и, при соответствии условиям, поместит их в настроенное ХДД S3. Однако для регистра из расширения это не происходит, что указывает на необходимость более глубокого исследования механизмов работы платформы.

Возможные причины и пути решения

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

  1. Особенности взаимодействия расширений с новым функционалом ХДД S3 в платформе 8.3.27

    Механизм расширений в 1С:Предприятии — это мощный, но иногда капризный инструмент. Он позволяет модифицировать функционал конфигурации без снятия с поддержки, что значительно упрощает обновление. Однако новые функции платформы, особенно те, которые глубоко затрагивают работу с данными и хранилищем, как ХДД S3, могут иметь специфическое поведение при взаимодействии с объектами, определенными в расширениях.

    В версии 8.3.27 функционал ХДД S3 был представлен как новый, и, как часто бывает с новыми возможностями, он может содержать недоработки или не полностью учитывать все сценарии использования, в частности, работу с объектами расширений. Платформа может по-разному обрабатывать объекты, созданные в основной конфигурации, и объекты, появившиеся через расширение, с точки зрения автоматического вынесения данных в ХДД. Возможно, внутренние механизмы платформы не всегда корректно регистрируют или инициализируют свойства объектов расширений для автоматического переноса в S3.

    Что мы можем сделать:

    • Проверка версии платформы: Если вы работаете не с самой последней сборкой 8.3.27, рекомендуем обновиться до актуального патча. Возможно, проблема уже была идентифицирована и исправлена разработчиками 1С.
    • Тестирование на 8.3.28: В версии 8.3.28 анонсированы дальнейшие улучшения и развитие ХДД. Если есть возможность, проведите тестовое развертывание на предрелизной или стабильной версии 8.3.28, чтобы выяснить, сохраняется ли проблема. Это поможет понять, является ли текущее поведение особенностью 8.3.27 или более фундаментальным ограничением.
  2. Детальная проверка настроек ХДД S3 и конфигурации сервера 1С:Предприятия

    Даже если флажок "сохранять в ХДД" установлен, это не всегда гарантирует корректную работу, если основные настройки ХДД S3 выполнены неверно или неполно. Мы должны рассмотреть все уровни конфигурации.

    1. Настройки кластера серверов 1С:Предприятия:

      Критически важно убедиться, что кластер серверов 1С:Предприятия корректно настроен для работы с ХДД S3. Мы проверяем следующие параметры:

      • Параметры запуска rphost: В файлах конфигурации сервера 1С или через оснастку администрирования кластера (консоль сервера 1С) убедитесь, что присутствуют и корректно заданы параметры, указывающие на S3-хранилище (например, URL, ключи доступа, регион). Эти параметры могут быть заданы через аргументы командной строки или в конфигурационных файлах, таких как conf.cfg или s3cfg.xml (имя файла зависит от версии и типа хранилища).
      • Наличие и работоспособность S3-сервиса: Мы должны убедиться, что сам S3-сервис (например, MinIO, Amazon S3, Яндекс.Объектное хранилище) запущен, доступен по сети с сервера 1С:Предприятия и функционирует корректно. Проверьте сетевую связность (ping, telnet на порт S3), а также права доступа и авторизационные данные (access key, secret key).
      • Созданные профили ХДД: В версии 8.3.27 появилась возможность управления несколькими профилями ХДД. Проверьте, что нужный профиль S3 создан и является активным или выбранным по умолчанию для вашей информационной базы.
    2. Настройки информационной базы:

      Давайте зайдем в режим 1С:Предприятие под администратором или в конфигуратор, чтобы проверить настройки информационной базы:

      • Использование ХДД: В разделе "Администрирование" или "Настройки" убедитесь, что включено "Использовать хранилище двоичных данных" и выбран соответствующий вариант S3-совместимого хранилища.
      • Порог размера: Некоторые параметры ХДД могут включать пороговые значения размера данных, при превышении которых данные будут выгружаться в ХДД. Убедитесь, что эти пороги не препятствуют выгрузке ваших файлов.
    3. Режим совместимости:

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

    Что мы можем сделать: Мы настоятельно рекомендуем обратиться к официальной документации 1С для версии 8.3.27 по настройке ХДД S3. Проверяйте каждый параметр внимательно, поскольку даже небольшая опечатка может привести к неработоспособности.

  3. Глубокий анализ журнала регистрации

    Журнал регистрации — это наш главный инструмент диагностики. Он содержит информацию обо всех событиях, происходящих в системе. При возникновении проблем с ХДД S3, журнал регистрации должен содержать ключи к разгадке.

    Что мы ищем в журнале:

    • Ошибки и предупреждения: Мы должны внимательно просмотреть все записи типа "Ошибка" и "Предупреждение" в момент выполнения операции записи в регистр. Ищите сообщения, связанные с доступом к файлам, записью в базу данных, сетевыми операциями или сбоями при взаимодействии с внешними сервисами.
    • События ХДД: Платформа генерирует информационные события, связанные с работой ХДД. Мы должны искать записи, указывающие на попытки работы с ХДД, результаты этих попыток (успех/неудача), а также возможные причины отказа.
    • Контекст выполнения: Постарайтесь отследить последовательность событий, связанных с вашим сеансом работы и выполнением кода записи в регистр. Это поможет понять, на каком именно этапе происходит сбой.
    • Специфические сообщения S3: Ищите любые упоминания об S3, HTTP-ошибках (например, 403 Forbidden, 404 Not Found, 500 Internal Server Error), таймаутах или проблемах с аутентификацией. Эти сообщения напрямую укажут на проблемы взаимодействия с S3-сервисом.

    Что мы можем сделать: Увеличьте уровень детализации журнала регистрации, если это необходимо для получения более подробной информации. Это позволит нам получить максимально полную картину происходящего и выявить скрытые проблемы.

  4. Программное управление хранилищем двоичных данных как обходное решение

    Если после тщательной проверки всех настроек и анализа журнала регистрации автоматический механизм все равно отказывается работать с регистром из расширения, мы можем применить программный подход. Начиная с версии 8.3.27, платформа 1С предоставляет расширенные возможности для явного программного управления хранилищем двоичных данных. Этот метод позволяет нам взять процесс под полный контроль, минуя потенциальные ограничения или особенности автоматического механизма для объектов расширений.

    Ключевая идея состоит в том, чтобы не полагаться на автоматическое вынесение данных из ХранилищеЗначения в ХДД S3, а явно поместить двоичные данные в ХДД, получить ссылку на них, а уже эту ссылку сохранить в реквизите регистра.

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

    
    // Исходные ДвоичныеДанные, которые мы хотим сохранить
    ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ПрисоединенныйФайлСсылка.ПутьКФайлу);
    
    // 1. Создаем объект ХранилищеДвоичныхДанных.
    // Этот объект является шлюзом для взаимодействия с ХДД (S3, локальное и т.д.).
    // Если в кластере 1С настроено несколько мест размещения ХДД,
    // мы можем явно указать, куда помещать данные.
    // Например, получить конкретное S3-место размещения:
    // МестоРазмещенияS3 = МестаРазмещенияХранилищДвоичныхДанных.Получить(
    //    Новый МестоРазмещенияХранилищаДвоичныхДанныхS3("ИмяВашегоПрофиляS3ВНастройкахКластера"));
    // Если же S3 настроено как основное или единственное, можно использовать конструктор без параметров:
    ХДДОбъект = Новый ХранилищеДвоичныхДанных(); 
        
    // 2. Помещаем двоичные данные в ХДД.
    // Метод "Поместить" объекта ХранилищеДвоичныхДанных выполняет реальную запись
    // данных в настроенное внешнее хранилище (S3 в нашем случае).
    // Он возвращает УникальныйИдентификатор, который является "адресом" наших данных в ХДД.
    УникальныйИдентификаторДанныхВХДД = ХДДОбъект.Поместить(ДвоичныеДанныеФайла);
    
    // 3. Создаем новую запись в регистре сведений, как и ранее.
    НоваяЗапись = РегистрыСведений.VZ_БланкЗаказыФайлы.СоздатьМенеджерЗаписи();
    НоваяЗапись.ИмяФайла = ПрисоединенныйФайлДанные.ИмяФайла;
    
    // 4. Важнейший шаг: в реквизит ФайлХранилище (который должен быть типа ХранилищеЗначения)
    //    сохраняем теперь не сами ДвоичныеДанные, а полученный УникальныйИдентификатор.
    //    Теперь ХранилищеЗначения будет содержать не тяжелые байты файла, а легкую ссылку
    //    на эти данные, которые гарантированно лежат в S3.
    НоваяЗапись.ФайлХранилище = Новый ХранилищеЗначения(УникальныйИдентификаторДанныхВХДД);
        
    // 5. Записываем запись регистра.
    // Эта запись будет содержать в реквизите ФайлХранилище идентификатор,
    // по которому мы всегда сможем получить данные из ХДД.
    НоваяЗапись.Записать();
    

    При использовании такого подхода, реквизит ФайлХранилище перестает быть "первоисточником" двоичных данных, а становится их "указателем". Это позволяет нам полностью контролировать процесс размещения данных во внешнем хранилище. Для извлечения данных обратно из ХДД, мы будем использовать метод Получить объекта ХранилищеДвоичныхДанных, передавая ему сохраненный УникальныйИдентификатор:

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

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

  5. Обращение в техническую поддержку 1С

    Если после тщательного выполнения всех вышеперечисленных шагов, включая проверку настроек, анализ журнала регистрации и попытку программного управления, проблема остается нерешенной, это может указывать на возможную ошибку в самой платформе 1С:Предприятия. Учитывая, что функционал ХДД S3 в версии 8.3.27 является относительно новым, вероятность обнаружения такой ошибки существует.

    Что мы можем сделать: Мы настоятельно рекомендуем сформировать подробное описание проблемы, приложить скриншоты настроек, логи журнала регистрации, а также примеры кода, демонстрирующие различное поведение для основной конфигурации и расширения, и отправить запрос в официальную техническую поддержку 1С. Разработчики смогут провести более глубокий анализ и, при необходимости, выпустить исправление.

Итоги

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

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

← На главную