Альтернативное получение значения из хранилища значения. Свой ХранилищеЗначения.Получить();

22.04.19

Интеграция - Файловый обмен (TXT, XML, DBF), FTP

Данная публикация не претендует на использование в продакшене, но когда "Нельзя, но очень хочется" в отношении получения ооочень больших данных из ХранилищаЗначения и когда сама платформа не может получить значение и падает, при этом, перед падением съедает почти всю память. Это своего рода костыль, в безвыходной ситуации. Речь пойдет про получение больших данных из хранилища значения в файловых базах на 32-х битной платформе. Данное не касается 64-х битных клиентов/серверов где нет ограничения на размер потребляемой памяти (верней есть, но доступно памяти гораздо больше, чем 32-х битному приложению без PAE).

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
Альтернативное получение значения из хранилища значения. Свой ХранилищеЗначения.Получить();:
.epf 12,71Kb ver:0.1
14 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Вы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

Однажды, когда я был молодой и глупый (последнее правда с тех под и не изменилось), я решал задачу автоматического РИБ обмена через веб-сервис и в качестве контейнера для данных, я решил использовать передачу хранилища значения, в котором упакована с сжатием (9) строка содержимым XML файла сообщения. И всё бы ничего, работало это без проблем. Как вдруг, попался один узел, для которого накопилось ну очень много данных (смотря конечно для кого), а именно, XML данные весили чуть больше 400 Мб. в сжатом виде же это занимало примерно 60 Мб, через интернет клиент веб-сервиса данные то скачал, но при попытке ХранилищеЗначение.Получить(); (База файловая, памяти 2 Гб) 1С сначала кушала память ложками, до без малого 1 Гб съедала и с грохотом падала пугая голубей в соседнем дворе. Конечно, ручной обмен ни-кто не отменял (через классические файлы) и там всё проходило без проблем (как минимум по тому, что 1С не весь файл XML читает в память). Данная проблема воспроизводилась как на релизах 8.3.10.2699 и 8.3.12.1855 так и на других версиях.

А вы знали? 1С любит держать данные помещенные в ХранилищеЗначения в временном файле на диске? Разумеется имеется ввиду те данные, то лежат в памяти. Возможно, она так любит избавляться только от больших данных, но это уже совсем другая история...

Я было просто забил на проблему, ибо она редкая и можно обмен сделать ручками, так как просто не представлял как её можно решить, но тут я совершенно случайно наткнулся отличную публикацию: //infostart.ru/public/618906/ от SerVer1C (за что ему огромное спасибо!) и тут понеслось... Итогом этого, стал собственный метод, получающий значение хранилища значений, который по минимуму питается оперативной памятью, предпочитая ей обычный диск и главное, не валящий процесс 1С ну и конечно выполняющий свою задачу ;)

Суть решения "проста", запакованное хранилище значения из себя представляет данные, запакованные алгоритмом Deflate (которая сама 1С использует везде, а доступа к методам дать не могут) и некоторое служебные данные. Этим же методом Deflate, упаковываются ZIP архивы. Итого весь процесс проводится к следующему:

1) Получение из хранилища значений двоичных данных (да-да, 1С не добавила возможности прямого получения):

ДанныеВBase64 = XMLСтрока(ХранилищеЗначения); // Получим Base64 хранилища значения
ДвоичныеДанные = Base64Значение(ДанныеВBase64); // Получаем двоичные данные хранилища значения

2) Получаем буфер двоичных за вычетом префикса хранилища значения

РазмерСлужебногоЗаголовка = 18; // Размер в байтах служебного заголовка хранилища значения
Поток = ДвоичныеДанные.ОткрытьПотокДляЧтения(); // Открываем поток для данных
Поток.Перейти(РазмерСлужебногоЗаголовка, ПозицияВПотоке.Начало); // Прыгаем в начало данных
РазмерПотока = Поток.Размер() - РазмерСлужебногоЗаголовка;
БуферТелаФайла = Новый БуферДвоичныхДанных(РазмерПотока); // Создаем буфер под данные
Поток.Прочитать(БуферТелаФайла, 0, РазмерПотока); // Читаем данные в буфер
Поток.Закрыть();

3) Формируем структуру ZIP архива и добавляем к нему данные из буфера двоичных данных

ДлинаИмениСжатогоФайла		= СтрДлина(ИмяФайлаВАрхиве);
РазмерСжатогоФайла			= РазмерПотока;
... // Подробнее можно ознакомится в приложенном файле и/или в исходной публикации: //infostart.ru/public/618906/
НовыйБинарник = ПотокВПамяти.ЗакрытьИПолучитьДвоичныеДанные();
НовыйБинарник.Записать(ПутьКФайлуАрхива);
ПотокВПамяти.Закрыть();

4) Распаковать ZIP архив, игнорируя ошибки распаковки (так как у нас нет данных о CRC сумме НЕ запакованных данных, а так же об их размере)

// Можно было и в памяти извлекать, но слишком много памяти кушает
Архив = Новый ЧтениеZipФайла(ПутьКФайлуАрхива);
Попытка
	Архив.Извлечь(Архив.Элементы[0], КаталогОбмена);
	//файл извлечется, хотя здесь возникнет исключение из-за некорректных размера файла и контрольной суммы
Исключение
КонецПопытки;

5) На выходе, мы уже получаем распакованные данные, которые были помещены в хранилище значения, НО, они окружены структурой, похожей на JSON которая всюду используется в 1С как минимум с 1С 7.7 (или даже раньше), для того чтобы от неё избавится, надо в начале файла отрезать чуток и в конце, а так-же убрать экранирование кавычек. Тут я пробовал разные варианты (кроме считывания всего текста и СтрЗаменить, ибо память не безлимитная, но и такой способ работает и 1С не падает), но самым оптимальным как по скорости, так и по потреблению памяти, оказалось порционное чтение из файла, замена двойных кавычек на одинарные и запись в результирующий файл (выполняется мгновенно, пруфов нет)

ПотокЧтения = Новый ФайловыйПоток(ПутьКИзвлеченномуФайлу, РежимОткрытияФайла.Открыть, ДоступКФайлу.Чтение);
ЧтениеТекста = Новый ЧтениеТекста(ПотокЧтения, КодировкаТекста.UTF8);
ПотокЗаписи = Новый ФайловыйПоток(ПутьКФайлуРезультата, РежимОткрытияФайла.Создать, ДоступКФайлу.Запись);
ЗаписьТекста = Новый ЗаписьДанных(ПотокЗаписи, КодировкаТекста.UTF8);
БуферТекста = ЧтениеТекста.Прочитать(50*1024*1024); // Делим по 50 мегабайт
ТекущаяПорция = Неопределено;
ПерваяСтрокаСчитана = Ложь;
Пока БуферТекста <> Неопределено Цикл 
	Если ТекущаяПорция <> Неопределено Тогда
		ЗаписьТекста.ЗаписатьСимволы(ТекущаяПорция, КодировкаТекста.UTF8);
		ЗаписьТекста.СброситьБуферы();
	КонецЕсли;
	Если Не ПерваяСтрокаСчитана Тогда
		БуферТекста = Прав(БуферТекста, СтрДлина(БуферТекста) - 15);
		ПерваяСтрокаСчитана = Истина;
	КонецЕсли;
	Если Прав(БуферТекста, 1) = """" Тогда
		// В конце нашли одинокую кавычку, надо её удалить
		БуферТекста = Лев(БуферТекста, СтрДлина(БуферТекста) - 1);
	КонецЕсли;
	ТекущаяПорция = СтрЗаменить(БуферТекста, """""", """");
	БуферТекста = ЧтениеТекста.Прочитать(ДелитьПо);
КонецЦикла;
Если ТекущаяПорция <> Неопределено Тогда
	ТекущаяПорция = СтрЗаменить(ТекущаяПорция, """}", "");
	ЗаписьТекста.ЗаписатьСимволы(ТекущаяПорция, КодировкаТекста.UTF8);
КонецЕсли;
ЧтениеТекста.Закрыть();
ПотокЧтения.Закрыть();
ЗаписьТекста.Закрыть();
ПотокЗаписи.Закрыть();

6) Profit! На выходе мы получаем файл имеющий в точности то же содержимое, что и положили в Хранилище значение. Тут можно и сразу в память считывать порцию данных из файла и в порции производить все замены, но так как мне дальше не обязательно держать в памяти именно строкой всю XML и для ещё большей оптимизации, решил делать запись в файл и его потом уже подавать процедуре чтения сообщения обмена.

7) Так же не забывайте убирать за собой, помогите сборщику мусора 1С, донесите свой мусор хотя бы до помойки:

Мусор = Неопределено;

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

Тем же, кто думает о своей реализации обмена данными через веб-сервис, я бы пожалуй посоветовал паковку в ZIP архив на сервере (можно даже в памяти это сделать, без записи на диск) и передавать двоичные данные, а на клиенте уже сохранить полученные двоичные данные на диск, а дальше можно использовать типовой механизм.

Выражаю благодарность автору обработки, которая сделала сказку - былью!
Если у вас есть лишние помидоры и яйца, то вспомните о голодающих ;)

PS: Прошу обратить внимание на то, что данная публикация, получает строку, помещенную в хранилище значение, если вы хотите таким образов получать другие типы данных помещенные в хранилище значение, вам явно придется вооружится напильником, но нет ничего не возможного!

PS: Так же надо учитывать, что данный способ медленней чем штатный способ получения значения! Обратите так же внимание, тестировать обработку лучше в файловой базе или хотя бы на 32-х битном сервере 1С, где есть техническое ограничение на потребляемую память. На 64-х битном сервере 1С, даже очень большие данные сможет получить. Да, обработка не демонстрирует проблему, а демонстрирует решение.

Вступайте в нашу телеграмм-группу Инфостарт

ХранилищеЗначения ХранилищеЗначения.Получить(); Вылетает

См. также

Перенос данных 1C Программист 1С:Предприятие 8 1С:Управление производственным предприятием 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Перенос документов, начальных остатков и справочной информации из УПП 1.3 в ERP 2 | из УПП 1.3 в УТ 11 | из УПП в КА 2 | Правила конвертации (КД 2) | Более 360 предприятий выполнили переход с использованием этого продукта! | Сэкономьте время - используйте готовое решение для перехода! | Позволяет перенести из УПП 1.3 в ERP / УТ 11 / КА 2 всю возможную информацию | В переносе есть фильтр по организации и множество других опциональных параметров выгрузки | Есть несколько алгоритмов выгрузки остатков на выбор

58000 руб.

04.08.2015    193059    466    309    

465

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С:Предприятие 8 1С:Комплексная автоматизация 1.х 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена | Можно выполнить переход с УПП на БП 3 или запускать выгрузку данных за выбранный период времени | Переносятся документы, начальные остатки и вся справочная информация | Есть фильтр по организации и множество других параметров выгрузки | Поддерживается несколько сценариев работы: как первичный полный перенос, так и перенос только новых документов | Перенос данных возможен в "1С: Бухгалтерия 3.0" версии ПРОФ, КОРП или базовую | Переход с "1С: УПП1.3" / "1С:КА 1.1" на "1С:БП3.0" с помощью правил конвертации будет максимально комфортным! | Можно бесплатно проверить перенос на вашем сервере!

50050 руб.

25.02.2015    191235    375    295    

428

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Программист 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Перенос данных из ERP в БП 3 | из КА 2 в БП 3 | из УТ 11 в БП 3 | из ЕРП в БП 3 | Сэкономьте время - используйте готовое решение для перехода! | Перенос разработан в формате КД 2 (правила конвертации данных) | Переносятся все возможные виды документов, начальных остатков и нормативно-справочная информация| Можно опционально выгружать каждую пару "номенклатура+характеристика" как отдельную номенклатуру | Есть выгрузка настроек счетов учета и зарплатных данных из ERP / КА 2 | Можно проверить на вашем сервере перед покупкой

58000 руб.

15.04.2019    86523    232    182    

168

SALE! 15%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С:Предприятие 8 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Платные (руб)

Правила в универсальном формате обмена для ERP 2.5, КА 2.5, УТ 11.5, БП 3.0, Розница, УНФ, для последних версий конфигураций. Ссылки на другие конфигурации в описании публикации. Правила совместимы со всеми другими версиями конфигураций новыми и старыми, поддерживающими обмен и синхронизацию в формате EnterpriseData. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

27633 руб.

12.06.2017    163593    993    329    

487

Перенос данных 1C Взаиморасчеты Оптовая торговля Логистика, склад и ТМЦ Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С:Предприятие 8 1С:Управление торговлей 10 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Управленческий учет Платные (руб)

Можно проверить до покупки, оставьте заявку! Воспользовались более 268 компаний! Перенос данных из УТ 10.3 в УТ 11 | из УТ 10.3 в КА 2 | из УТ 10.3 в ERP. Решение для перехода с УТ 10.3. Можно перенести начальные остатки, нормативно-справочную информацию и все возможные документы. При выгрузке можно установить отбор по периоду, организациям и складам.

50200 руб.

24.04.2015    209900    180    253    

299

SALE! 10%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С:Предприятие 8 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Управленческий учет Платные (руб)

Переносите справочную информацию, остатки и документы из УПП 1.3 в Бухгалтерию 3.0 с помощью готовых правил. Переносится более 50 видов документов. Простой интерфейс и понятные настройки.

42000 37800 руб.

15.12.2021    36035    263    68    

201

Файловый обмен (TXT, XML, DBF), FTP Перенос данных 1C Системный администратор Программист Бухгалтер 1С:Предприятие 8 1С:Бухгалтерия 3.0 Россия Платные (руб)

Обработка не только формирует начальные остатки по всем счетам на нужную дату (экономя время на свёртке базы БП 3), но и полностью переносит справочные данные и документы за заданный период. Гибкая настройка включает фильтр по организациям и множество параметров выгрузки. Работайте в удобном формате: выполните однократный полный переход или настройте регулярную догрузку только новых документов из БП 3 в БП 3.0. Интеграция правил конвертации в план обмена гарантирует точную выгрузку исключительно зарегистрированных объектов.

70760 руб.

10.04.2026    1148    3    8    

2

Рабочее место Производство готовой продукции (работ, услуг) Перенос данных 1C Пользователь 1С:Предприятие 8 1С:Управление производственным предприятием 1С:Документооборот 1С:Комплексная автоматизация 2.х 1С:КА 1С:ДО Платные (руб)

Продукт "Интеграция с 1С:Документооборот" позволяет использовать функции программы "1С:Документооборот 8" напрямую из учетной системы (1С:УПП; 1С:КА, 1С:УТ 10.3, 1С:БГУ 1.0, 1С:ЗБУ 1.0, 1С:УПП для Казахстана и отраслевых решений, разработанных на их основе) на платформе "1С:Предприятие 8": выполнять и ставить задачи, просматривать документы, скан-копии и прочие файлы, штрих-кодировать документы отправлять письма, вести учет рабочего времени - не входя в "1С:Документооборот 8", работая в одной программе, что значительно сокращает время и делает работу более комфортной и эффективной. Продукт прошел сертификацию 1С-Совместимо

135530 руб.

11.06.2015    63517    39    20    

51
Для отправки сообщения требуется регистрация/авторизация