Архив за месяц: Декабрь 2014

Перекодировка строки средствами 1С без записи на диск.

При подключении к 1С:УТ 10.3 принтера чеков от Posiflex с использованием родного OPOS драйвера понадобилось конвертировать строки из кодировки CP866 в кодировку CP1251. Получилось сделать так:
Читать далее

Движок 1С вылетает с ошибкой. Обмен с файлами и картинками с сайтом битрикс из конфигурации Управление торговлей 11.

1С: УТ, 11.1.7.54, 8.3.5.1248

Проблема: Если в настройках обмена снять галку «Картинки и файлы» обмен проходит нормально. Если галка установлена, при выгрузке на сайт или на диск 1С падает вследствие нехватки памяти.

Решение:
Первоначально было выполнено тестирование и исправление базы.
Исследование запросов по картинкам, подключаемых в случае, если галка установлена, показало следующее. Запрос проходит нормально, если у товара есть хотя бы одна присоединенная картинка (Справочники.НоменклатураПрисоединеныеФайлы).

В исходном запросе (Б_ОбменССайтомСервер, 6211), привязка идет следующим образом Справочники.Номенклатура -> (По владельцу) Справочники.НоменклатураПрисоединенныеФайлы -> (здесь бинарники картинок) РегистрыСведений.ПрисоединенныеФайлы.


ВЫБРАТЬ РАЗРЕШЕННЫЕ
ВремНоменклатура.Номенклатура КАК Номенклатура,
НоменклатураПрисоединенныеФайлы.Ссылка КАК Файл,
НоменклатураПрисоединенныеФайлы.Наименование КАК Наименование,
НоменклатураПрисоединенныеФайлы.Описание КАК Описание,
НоменклатураПрисоединенныеФайлы.Том КАК Том,
НоменклатураПрисоединенныеФайлы.ТипХраненияФайла КАК ТипХраненияФайла,
НоменклатураПрисоединенныеФайлы.Расширение КАК Расширение,
НоменклатураПрисоединенныеФайлы.ПутьКФайлу КАК ПутьКФайлу,
ПрисоединенныеФайлы.ХранимыйФайл КАК ХранимыйФайл,
ВЫБОР
КОГДА ВремНоменклатура.ФайлКартинки = НоменклатураПрисоединенныеФайлы.Ссылка
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ КАК Основная
ПОМЕСТИТЬ ВремФайлыНоменклатурыВсе
ИЗ
ВремНоменклатура КАК ВремНоменклатура
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.НоменклатураПрисоединенныеФайлы КАК НоменклатураПрисоединенныеФайлы
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПрисоединенныеФайлы КАК ПрисоединенныеФайлы
ПО НоменклатураПрисоединенныеФайлы.Ссылка = ПрисоединенныеФайлы.ПрисоединенныйФайл
И (НоменклатураПрисоединенныеФайлы.ТипХраненияФайла = ЗНАЧЕНИЕ(Перечисление.ТипыХраненияФайлов.ВИнформационнойБазе))
ПО (НоменклатураПрисоединенныеФайлы.ВладелецФайла = ВремНоменклатура.Номенклатура)
И (НЕ НоменклатураПрисоединенныеФайлы.ПометкаУдаления)
ИНДЕКСИРОВАТЬ ПО
Номенклатура
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВремФайлыНоменклатурыВсе.Номенклатура КАК Номенклатура,
ВремФайлыНоменклатурыВсе.Файл,
ВремФайлыНоменклатурыВсе.Наименование,
ВремФайлыНоменклатурыВсе.Том,
ВремФайлыНоменклатурыВсе.ТипХраненияФайла,
ВремФайлыНоменклатурыВсе.Расширение,
ВремФайлыНоменклатурыВсе.ПутьКФайлу,
ВремФайлыНоменклатурыВсе.ХранимыйФайл,
ВЫБОР
КОГДА ВремФайлыНоменклатурыВсе.Расширение В (&СписокРасширенийКартинок)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ КАК ЭтоКартинка,
ВЫБОР
КОГДА НоменклатураПрисоединенныеФайлы.Ссылка ЕСТЬ NULL
ТОГДА ЛОЖЬ
ИНАЧЕ ИСТИНА
КОНЕЦ КАК НадоВыгружать,
ВремФайлыНоменклатурыВсе.Основная,
ВремФайлыНоменклатурыВсе.Том.ПолныйПутьLinux,
ВремФайлыНоменклатурыВсе.Том.ПолныйПутьWindows
ПОМЕСТИТЬ ВремФайлыНоменклатуры
ИЗ
ВремФайлыНоменклатурыВсе КАК ВремФайлыНоменклатурыВсе
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.НоменклатураПрисоединенныеФайлы КАК НоменклатураПрисоединенныеФайлы
ПО ВремФайлыНоменклатурыВсе.Файл = НоменклатураПрисоединенныеФайлы.Ссылка
И (ВЫБОР
КОГДА &ВыгружатьВсеКартинки
ТОГДА ИСТИНА
ИНАЧЕ НоменклатураПрисоединенныеФайлы.Ссылка В
(ВЫБРАТЬ
НоменклатураПрисоединенныеФайлыИзменения.Ссылка
ИЗ
Справочник.НоменклатураПрисоединенныеФайлы.Изменения КАК НоменклатураПрисоединенныеФайлыИзменения
ГДЕ
НоменклатураПрисоединенныеФайлыИзменения.Узел = &Узел)
КОНЕЦ)
ГДЕ
НЕ ВремФайлыНоменклатурыВсе.Файл = ЗНАЧЕНИЕ(Справочник.НоменклатураПрисоединенныеФайлы.ПустаяСсылка)
ИНДЕКСИРОВАТЬ ПО
Номенклатура
;
////////////////////////////////////////////////////////////////////////////////
УНИЧТОЖИТЬ ВремФайлыНоменклатурыВсе

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

Меняем весь пакет (ЗапросПоКартинкамИФайлам =) на:

ВЫБРАТЬ РАЗРЕШЕННЫЕ
ВремНоменклатура.Номенклатура КАК Номенклатура,
НоменклатураПрисоединенныеФайлы.Ссылка КАК Файл,
НоменклатураПрисоединенныеФайлы.Наименование КАК Наименование,
НоменклатураПрисоединенныеФайлы.Описание КАК Описание,
НоменклатураПрисоединенныеФайлы.Том КАК Том,
НоменклатураПрисоединенныеФайлы.ТипХраненияФайла КАК ТипХраненияФайла,
НоменклатураПрисоединенныеФайлы.Расширение КАК Расширение,
НоменклатураПрисоединенныеФайлы.ПутьКФайлу КАК ПутьКФайлу,
ВЫБОР
КОГДА ВремНоменклатура.ФайлКартинки = НоменклатураПрисоединенныеФайлы.Ссылка
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ КАК Основная
ПОМЕСТИТЬ ВТ_ВремПривязкаФайлов
ИЗ
ВремНоменклатура КАК ВремНоменклатура
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.НоменклатураПрисоединенныеФайлы КАК НоменклатураПрисоединенныеФайлы
ПО (НоменклатураПрисоединенныеФайлы.ВладелецФайла = ВремНоменклатура.Номенклатура)
И (НЕ НоменклатураПрисоединенныеФайлы.ПометкаУдаления)
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
СверткаВПФ.ХранимыйФайл,
ВТ_ВремПривязкаФайлов.Номенклатура,
ВТ_ВремПривязкаФайлов.Файл,
ВТ_ВремПривязкаФайлов.Наименование,
ВТ_ВремПривязкаФайлов.Описание,
ВТ_ВремПривязкаФайлов.Том,
ВТ_ВремПривязкаФайлов.ТипХраненияФайла,
ВТ_ВремПривязкаФайлов.Расширение,
ВТ_ВремПривязкаФайлов.ПутьКФайлу,
ВТ_ВремПривязкаФайлов.Основная
ПОМЕСТИТЬ ВремФайлыНоменклатурыВсе
ИЗ
ВТ_ВремПривязкаФайлов КАК ВТ_ВремПривязкаФайлов
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
ПрисоединенныеФайлы.ПрисоединенныйФайл КАК ПрисоединенныйФайл,
ПрисоединенныеФайлы.ХранимыйФайл КАК ХранимыйФайл
ИЗ
РегистрСведений.ПрисоединенныеФайлы КАК ПрисоединенныеФайлы
ГДЕ
ПрисоединенныеФайлы.ПрисоединенныйФайл В
(ВЫБРАТЬ
ВТ_ВПФ.Файл
ИЗ
ВТ_ВремПривязкаФайлов КАК ВТ_ВПФ)) КАК СверткаВПФ
ПО ВТ_ВремПривязкаФайлов.Файл = СверткаВПФ.ПрисоединенныйФайл
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВремФайлыНоменклатурыВсе.Номенклатура КАК Номенклатура,
ВремФайлыНоменклатурыВсе.Файл,
ВремФайлыНоменклатурыВсе.Наименование,
ВремФайлыНоменклатурыВсе.Том,
ВремФайлыНоменклатурыВсе.ТипХраненияФайла,
ВремФайлыНоменклатурыВсе.Расширение,
ВремФайлыНоменклатурыВсе.ПутьКФайлу,
ВремФайлыНоменклатурыВсе.ХранимыйФайл,
ВЫБОР
КОГДА ВремФайлыНоменклатурыВсе.Расширение В (&СписокРасширенийКартинок)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ КАК ЭтоКартинка,
ВЫБОР
КОГДА НоменклатураПрисоединенныеФайлы.Ссылка ЕСТЬ NULL
ТОГДА ЛОЖЬ
ИНАЧЕ ИСТИНА
КОНЕЦ КАК НадоВыгружать,
ВремФайлыНоменклатурыВсе.Основная,
ВремФайлыНоменклатурыВсе.Том.ПолныйПутьLinux,
ВремФайлыНоменклатурыВсе.Том.ПолныйПутьWindows
ПОМЕСТИТЬ ВремФайлыНоменклатуры
ИЗ
ВремФайлыНоменклатурыВсе КАК ВремФайлыНоменклатурыВсе
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.НоменклатураПрисоединенныеФайлы КАК НоменклатураПрисоединенныеФайлы
ПО ВремФайлыНоменклатурыВсе.Файл = НоменклатураПрисоединенныеФайлы.Ссылка
И (ВЫБОР
КОГДА &ВыгружатьВсеКартинки
ТОГДА ИСТИНА
ИНАЧЕ НоменклатураПрисоединенныеФайлы.Ссылка В
(ВЫБРАТЬ
НоменклатураПрисоединенныеФайлыИзменения.Ссылка
ИЗ
Справочник.НоменклатураПрисоединенныеФайлы.Изменения КАК НоменклатураПрисоединенныеФайлыИзменения
ГДЕ
НоменклатураПрисоединенныеФайлыИзменения.Узел = &Узел)
КОНЕЦ)
ГДЕ
НЕ ВремФайлыНоменклатурыВсе.Файл = ЗНАЧЕНИЕ(Справочник.НоменклатураПрисоединенныеФайлы.ПустаяСсылка)
ИНДЕКСИРОВАТЬ ПО
Номенклатура
;
////////////////////////////////////////////////////////////////////////////////
УНИЧТОЖИТЬ ВремФайлыНоменклатурыВсе

Результат: а. Все работает. б. Запрос выполняется быстрее.