Картинки 1С программно: вывод на форму, файл, хранилище

Дата: 06.10.2026 16:54:16
Управляемые формы
Программирование 1С
Временное хранилище
Файлы 1С
БСП
Комментарий:
0
Платформа:
8.3
Конфигурация:
Любая
Формы:
Управляемые

Картинки 1С программно выводят на управляемую форму через поле картинки: элемент связывают со строковым реквизитом формы, а в реквизит записывают адрес во временном хранилище или навигационную ссылку. Ниже — общий модуль подготовки картинки, превью в списке номенклатуры, загрузка с диска с проверкой, галерея товара со сменой картинки и масштаб поля. Код для платформы 8.3, имена регистров и своих модулей условные, имена БСП сверены по УТ 11.4 и КА 2.5.

Где нужна картинка на форме и откуда её брать

Картинки в форме 1С обычно просят в карточке товара, рядом со списком номенклатуры, в обработке загрузки фото и там, где сотрудник сверяет скан документа. В УТ 11.4 и КА 2.5 карточка номенклатуры картинку уже показывает, а форма списка — нет, поэтому превью в списке — частая доработка.

Для вывода картинки из базы или файла у формы есть поле вида «Поле картинки», привязанное к реквизиту типа Строка. Картинка в реквизите не лежит — там адрес, по которому клиент сам запросит данные у сервера. Чем заполнить адрес, зависит от источника:

ИсточникЧто записать в реквизит поля
Реквизит ХранилищеЗначения записанного объектаПолучитьНавигационнуюСсылку(Ссылка, "Картинка")
Ресурс регистра сведенийНавигационную ссылку по ключу записи и имени ресурса или адрес во временном хранилище
Хранилище в константе или в выборке запросаПолучить() на сервере, затем ПоместитьВоВременноеХранилище
Файл с диска пользователяАдрес из ПоместитьФайлНаСерверАсинх
Присоединённый файл БСП (ФайлКартинки в УТ 11 и КА 2)РаботаСФайлами.ДвоичныеДанныеФайла и временное хранилище
Общая картинка конфигурации, стандартная картинка платформыНе поле, а свойство Картинка декорации или кнопки

Навигационная ссылка на реквизит-хранилище в форме элемента разобрана в статье про хранилище значения. Здесь — случаи, когда картинку надо подготовить на сервере: распаковать, проверить, уменьшить или выбрать из нескольких файлов.

Картинки 1С программно: поле картинки и временное хранилище

Чтобы вывести картинку, добавьте в реквизиты формы АдресКартинки типа Строка неограниченной длины, перетащите его в дерево элементов и в свойстве «Вид» выберите «Поле картинки». Главные свойства поля картинки 1С:

  • РазмерКартинки — как вписать картинку: Пропорционально для превью, РеальныйРазмер для просмотра один к одному, Растянуть — с искажением пропорций;
  • ТекстНевыбраннойКартинки — надпись, пока адрес пустой;
  • Гиперссылка — при Истина щелчок по полю вызывает событие Нажатие;
  • Масштабировать и Масштаб — прокрутка и увеличение, о них ниже.

Так устроена карточка товара в УТ 11.4 и КА 2.5. В конфигураторе откройте Справочники → Номенклатура → Формы → ФормаЭлемента: поле ФайлКартинки привязано к реквизиту формы АдресКартинки, адрес заполняет ОбновитьАдресКартинки через РаботаСФайлами.ДанныеФайла(Объект.ФайлКартинки, УникальныйИдентификатор).СсылкаНаДвоичныеДанныеФайла. Щелчок по пустому полю добавляет картинку, по заполненному — открывает файл.

Главное правило: передавайте в ПоместитьВоВременноеХранилище уникальный идентификатор формы, тогда данные живут, пока форма открыта. Без второго параметра значение удаляется после очередного вызова сервера, и картинка пропадает при первом действии пользователя. Подготовку картинки удобно собрать в общем серверном модуле:

// Общий модуль РаботаСКартинками (имя условное), флажок «Сервер».
// Функции вызываются из серверных процедур модулей форм.

// Приводит картинку к двоичным данным. Источник — ДвоичныеДанные, Картинка
// или ХранилищеЗначения. Неопределено — если картинки нет.
Функция ДвоичныеДанныеКартинки(Знач Источник) Экспорт

    Если ТипЗнч(Источник) = Тип("ХранилищеЗначения") Тогда
        Источник = Источник.Получить(); // пустое хранилище вернёт Неопределено
    КонецЕсли;

    Если ТипЗнч(Источник) = Тип("Картинка") Тогда
        Возврат Источник.ПолучитьДвоичныеДанные();
    ИначеЕсли ТипЗнч(Источник) = Тип("ДвоичныеДанные") Тогда
        Возврат Источник;
    КонецЕсли;

    Возврат Неопределено;

КонецФункции

// Истина, если в данных картинка известного платформе формата.
Функция ЭтоКартинка(Знач ДанныеФайла) Экспорт
    Возврат КартинкаИзДанных(ДанныеФайла) <> Неопределено;
КонецФункции

// Уменьшает JPEG, PNG и BMP так, чтобы большая сторона была не длиннее
// МаксимальнаяСторона пикселей. Остальные форматы возвращает как есть.
Функция УменьшеннаяКопия(Знач ДанныеКартинки, Знач МаксимальнаяСторона = 1200) Экспорт

    Картинка = КартинкаИзДанных(ДанныеКартинки);
    Если Картинка = Неопределено Тогда
        Возврат Неопределено; // не картинка: показывать нечего
    КонецЕсли;

    ФорматИсходника = Картинка.Формат();
    Если ФорматИсходника <> ФорматКартинки.JPEG
        И ФорматИсходника <> ФорматКартинки.PNG
        И ФорматИсходника <> ФорматКартинки.BMP Тогда
        Возврат ДанныеКартинки; // SVG, GIF, TIFF и значки не трогаем
    КонецЕсли;

    Ширина = Картинка.Ширина();
    Высота = Картинка.Высота();
    Если Ширина = Неопределено Или Макс(Ширина, Высота) <= МаксимальнаяСторона Тогда
        Возврат ДанныеКартинки;
    КонецЕсли;

    Обработка = Новый ОбрабатываемаяКартинка(Картинка); // 8.3.14+, сервер и толстый клиент
    Если Ширина >= Высота Тогда
        Обработка.УстановитьРазмер(МаксимальнаяСторона); // высоту платформа посчитает сама
    Иначе
        Обработка.УстановитьРазмер(, МаксимальнаяСторона);
    КонецЕсли;
    Если ФорматИсходника = ФорматКартинки.BMP Тогда
        Обработка.УстановитьФормат(ФорматКартинки.JPEG); // BMP без сжатия в разы тяжелее
    КонецЕсли;

    Возврат Обработка.ПолучитьКартинку().ПолучитьДвоичныеДанные();

КонецФункции

// Кладёт картинку во временное хранилище формы и возвращает адрес для реквизита поля.
// Прежний адрес освобождает. Неопределено вместо данных очищает поле.
Функция АдресДляПоля(Знач ДанныеКартинки, Знач ИдентификаторФормы, Знач ПрежнийАдрес = "") Экспорт

    Если ЭтоАдресВременногоХранилища(ПрежнийАдрес) Тогда
        УдалитьИзВременногоХранилища(ПрежнийАдрес);
    КонецЕсли;

    Если ДанныеКартинки = Неопределено Тогда
        Возврат ""; // поле покажет ТекстНевыбраннойКартинки
    КонецЕсли;

    // с идентификатором формы данные живут, пока форма открыта
    Возврат ПоместитьВоВременноеХранилище(ДанныеКартинки, ИдентификаторФормы);

КонецФункции

// Картинка из двоичных данных или Неопределено, если в данных не картинка.
Функция КартинкаИзДанных(ДанныеФайла)

    Если ТипЗнч(ДанныеФайла) <> Тип("ДвоичныеДанные") Тогда
        Возврат Неопределено;
    КонецЕсли;

    Попытка
        Картинка = Новый Картинка(ДанныеФайла);
    Исключение
        Возврат Неопределено; // платформа не разобрала данные
    КонецПопытки;

    Если Картинка.Формат() = ФорматКартинки.НеизвестныйФормат Тогда
        Возврат Неопределено;
    КонецЕсли;

    Возврат Картинка;

КонецФункции
  • ДвоичныеДанныеКартинки принимает то, что обычно хранится в базе: хранилище значения, объект Картинка или двоичные данные. Пустое хранилище даёт Неопределено, и поле очищается.
  • КартинкаИзДанных перехватывает исключение конструктора и проверяет Формат(): PDF, переименованный в .jpg, картинкой не считается.
  • ОбрабатываемаяКартинка (с 8.3.14) уменьшает фото на сервере. УстановитьРазмер с одной заданной стороной считает вторую по пропорции. Векторный SVG функция не трогает: ПолучитьКартинку на векторном результате выдаёт ошибку. Многокадровые GIF и TIFF тоже показываются как есть.
  • АдресДляПоля удаляет прежний адрес, иначе каждая показанная картинка остаётся во временном хранилище до закрытия формы.
  • Во внешней обработке общий модуль не добавить: те же функции кладут в модуль формы с директивой &НаСервереБезКонтекста.

Хранилище значений на форме: картинка текущей строки списка

В тонком и веб-клиенте типа ХранилищеЗначения нет: по синтакс-помощнику он доступен на сервере, в толстом клиенте и во внешнем соединении. Поэтому хранилище распаковывают на сервере, а на форму отдают адрес. Пример — превью товара справа от списка номенклатуры, фото лежат в регистре сведений:

// Форма списка справочника Номенклатура. Фото лежат в регистре сведений
// КартинкиНоменклатуры (имя условное): измерение Номенклатура, ресурс Данные
// типа ХранилищеЗначения. Рядом со списком — поле Картинка, реквизит АдресКартинки (Строка).

&НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)

    // пока пользователь листает стрелками, сервер не вызываем
    ОтключитьОбработчикОжидания("ОбновитьКартинкуТекущейСтроки");
    ПодключитьОбработчикОжидания("ОбновитьКартинкуТекущейСтроки", 0.2, Истина);

КонецПроцедуры

&НаКлиенте
Процедура ОбновитьКартинкуТекущейСтроки()
    АдресКартинки = АдресКартинкиНоменклатуры(Элементы.Список.ТекущаяСтрока,
        УникальныйИдентификатор, АдресКартинки);
КонецПроцедуры

// Вызов без контекста: данные формы на сервер не передаются.
&НаСервереБезКонтекста
Функция АдресКартинкиНоменклатуры(Знач Номенклатура, Знач ИдентификаторФормы, Знач ПрежнийАдрес)

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    КартинкиНоменклатуры.Данные КАК Данные
    |ИЗ
    |    РегистрСведений.КартинкиНоменклатуры КАК КартинкиНоменклатуры
    |ГДЕ
    |    КартинкиНоменклатуры.Номенклатура = &Номенклатура";
    Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
    Выборка = Запрос.Выполнить().Выбрать();

    ДанныеКартинки = Неопределено;
    Если Выборка.Следующий() Тогда
        ДанныеКартинки = РаботаСКартинками.ДвоичныеДанныеКартинки(Выборка.Данные);
    КонецЕсли;

    // на клиент уходит превью, а не исходное фото
    Превью = РаботаСКартинками.УменьшеннаяКопия(ДанныеКартинки, 400);
    Возврат РаботаСКартинками.АдресДляПоля(Превью, ИдентификаторФормы, ПрежнийАдрес);

КонецФункции
  • Обработчик ожидания на 0,2 секунды с флагом «однократно» срабатывает, когда пользователь остановился на строке, — листание стрелками не вызывает сервер на каждой строке. Интервал меньше секунды допустим только с третьим параметром Истина.
  • Функция вызывается без контекста: на сервер уходят ссылка, идентификатор формы и прежний адрес, а не все данные формы.
  • Превью 400 пикселей по большей стороне: на клиент уходит маленькая копия, а не исходное фото. Для группы и пустого списка запрос ничего не вернёт, и поле очистится.
  • Если картинка — реквизит-хранилище самого справочника, своя серверная процедура не нужна: в ПриАктивизацииСтроки хватит АдресКартинки = ПолучитьНавигационнуюСсылку(Элементы.Список.ТекущаяСтрока, "Картинка") с проверкой, что текущая строка есть.

Установить картинку из файла: диалог, перетаскивание, проверка

Пользователь выбирает фото в диалоге или бросает файл мышью на поле. Файл уходит на сервер, там проверяется и уменьшается, а поле показывает готовую картинку.

// Модуль формы. Реквизит АдресКартинки (Строка) привязан к полю Картинка.
// В свойствах поля: РазрешитьПеретаскивание = Истина, СпособПеретаскиванияФайлов =
// КакСсылкаНаФайл, обработчики событий ПроверкаПеретаскивания и Перетаскивание.

&НаКлиенте
Асинх Процедура ЗагрузитьКартинку(Команда)

    Диалог = Новый ПараметрыДиалогаПомещенияФайлов;
    Диалог.Заголовок = "Выберите картинку";
    Диалог.Фильтр = "Картинки|*.jpg;*.jpeg;*.png;*.gif;*.bmp;*.tif;*.tiff;*.svg";

    ПередНачалом = Новый ОписаниеОповещения("ПроверитьРазмерФайла", ЭтотОбъект);
    Описание = Ждать ПоместитьФайлНаСерверАсинх(, ПередНачалом, , Диалог, УникальныйИдентификатор);
    ПринятьФайл(Описание);

КонецПроцедуры

&НаКлиенте
Процедура КартинкаПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка)

    СтандартнаяОбработка = Ложь;
    ТипЗначения = ТипЗнч(ПараметрыПеретаскивания.Значение);
    Если ТипЗначения <> Тип("СсылкаНаФайл") И ТипЗначения <> Тип("Массив") Тогда
        ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена; // принимаем только файлы
    КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура КартинкаПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка)

    СтандартнаяОбработка = Ложь;
    Значение = ПараметрыПеретаскивания.Значение;
    Если ТипЗнч(Значение) = Тип("Массив") И Значение.Количество() > 0 Тогда
        Значение = Значение[0]; // бросили несколько файлов — берём первый
    КонецЕсли;
    Если ТипЗнч(Значение) = Тип("СсылкаНаФайл") Тогда
        ЗагрузитьПеретащенныйФайл(Значение);
    КонецЕсли;

КонецПроцедуры

&НаКлиенте
Асинх Процедура ЗагрузитьПеретащенныйФайл(СсылкаНаФайл)

    ПередНачалом = Новый ОписаниеОповещения("ПроверитьРазмерФайла", ЭтотОбъект);
    Описание = Ждать ПоместитьФайлНаСерверАсинх(, ПередНачалом, , СсылкаНаФайл, УникальныйИдентификатор);
    ПринятьФайл(Описание);

КонецПроцедуры

&НаКлиенте
Процедура ПроверитьРазмерФайла(ПомещаемыйФайл, ОтказОтПомещенияФайла, ДополнительныеПараметры) Экспорт

    Если ПомещаемыйФайл.Размер() > 10 * 1024 * 1024 Тогда
        ОтказОтПомещенияФайла = Истина; // файл не уйдёт на сервер
        ПоказатьПредупреждение(, "Картинка больше 10 МБ, выберите файл поменьше.");
    КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ПринятьФайл(Описание)

    Если Описание = Неопределено Или Описание.ПомещениеФайлаОтменено Тогда
        Возврат; // диалог закрыт или файл отклонён по размеру
    КонецЕсли;

    ТекстОшибки = ПоказатьЗагруженнуюКартинку(Описание.Адрес);
    Если ЗначениеЗаполнено(ТекстОшибки) Тогда
        ПоказатьПредупреждение(, ТекстОшибки);
    Иначе
        Модифицированность = Истина; // в форме объекта картинку сохранят при записи
    КонецЕсли;

КонецПроцедуры

&НаСервере
Функция ПоказатьЗагруженнуюКартинку(Знач АдресФайла)

    ДанныеФайла = ПолучитьИзВременногоХранилища(АдресФайла);
    УдалитьИзВременногоХранилища(АдресФайла); // исходник больше не нужен

    Если Не РаботаСКартинками.ЭтоКартинка(ДанныеФайла) Тогда
        Возврат "Файл не распознан как картинка.";
    КонецЕсли;

    // фото с телефона уменьшаем: форма открывается быстрее, в базу ляжет меньший файл
    ДанныеКартинки = РаботаСКартинками.УменьшеннаяКопия(ДанныеФайла, 1600);
    АдресКартинки = РаботаСКартинками.АдресДляПоля(ДанныеКартинки, УникальныйИдентификатор, АдресКартинки);
    Возврат "";

КонецФункции
  • ПоместитьФайлНаСерверАсинх (с 8.3.18) с ПараметрыДиалогаПомещенияФайлов открывает диалог, а со СсылкаНаФайл передаёт перетащенный файл. В режиме совместимости ниже 8.3.18 те же параметры принимает НачатьПомещениеФайлаНаСервер (с 8.3.15), первым у него идёт описание оповещения о завершении.
  • Оповещение «перед началом» получает СсылкаНаФайл: Размер() проверяет файл до передачи, а ОтказОтПомещенияФайла = Истина отменяет помещение, и тяжёлый файл не идёт по сети.
  • ПроверкаПеретаскивания со СтандартнаяОбработка = Ложь разрешает бросить файл на поле, а для прочих значений ставит ДействиеПеретаскивания.Отмена. В веб-клиенте при КакСсылкаНаФайл проверка вызывается один раз, при отпускании кнопки мыши.
  • Фильтр диалога — подсказка, расширение пользователь может поменять. Поэтому сервер проверяет содержимое через ЭтоКартинка.
  • В форме объекта картинку записывают в ПередЗаписьюНаСервере: ПолучитьИзВременногоХранилища(АдресКартинки) и новое хранилище значения в реквизит. Передача файлов между клиентом и сервером подробнее — в статье про двоичные данные.

Фото с телефона весит несколько мегабайт; перед записью в базу его стоит ужать — как уменьшить размер картинки в 1С.

Присоединённые файлы: галерея товара и смена картинки

В УТ 11.4 и КА 2.5 реквизит ФайлКартинки справочника Номенклатура ссылается на справочник НоменклатураПрисоединенныеФайлы. Фото у товара бывает несколько, а карточка показывает одно основное. Галерея перебирает все картинки товара кнопками «Предыдущая» и «Следующая»:

// Форма «Картинки товара» для УТ 11 и КА 2 (обработка в расширении, имена условные).
// Параметр формы Номенклатура. Реквизиты: АдресКартинки (Строка) — к нему привязано
// поле Картинка, ФайлыКартинок (СписокЗначений), ИндексКартинки (Число).
// Команды Предыдущая и Следующая.

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    ЗаполнитьФайлыКартинок(Параметры.Номенклатура);
    ПоказатьКартинкуПоИндексу(0);

КонецПроцедуры

&НаСервере
Процедура ЗаполнитьФайлыКартинок(Номенклатура)

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ РАЗРЕШЕННЫЕ
    |    ФайлыТовара.Ссылка КАК Ссылка,
    |    ФайлыТовара.Наименование КАК Наименование,
    |    ФайлыТовара.Расширение КАК Расширение,
    |    ВЫБОР
    |        КОГДА ФайлыТовара.Ссылка = ФайлыТовара.ВладелецФайла.ФайлКартинки
    |            ТОГДА 0
    |        ИНАЧЕ 1
    |    КОНЕЦ КАК Приоритет
    |ИЗ
    |    Справочник.НоменклатураПрисоединенныеФайлы КАК ФайлыТовара
    |ГДЕ
    |    ФайлыТовара.ВладелецФайла = &Номенклатура
    |    И НЕ ФайлыТовара.ЭтоГруппа
    |    И НЕ ФайлыТовара.ПометкаУдаления
    |
    |УПОРЯДОЧИТЬ ПО
    |    Приоритет,
    |    ФайлыТовара.ДатаСоздания";
    Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
    Выборка = Запрос.Выполнить().Выбрать();

    Расширения = СтрРазделить("jpg,jpeg,png,gif,bmp,tif,tiff,svg", ",");
    ФайлыКартинок.Очистить();
    Пока Выборка.Следующий() Цикл
        // к товару прикладывают и PDF, и сертификаты: берём только картинки
        Если Расширения.Найти(НРег(Выборка.Расширение)) <> Неопределено Тогда
            ФайлыКартинок.Добавить(Выборка.Ссылка, Выборка.Наименование);
        КонецЕсли;
    КонецЦикла;

КонецПроцедуры

&НаСервере
Процедура ПоказатьКартинкуПоИндексу(Индекс)

    Количество = ФайлыКартинок.Количество();
    ДанныеФайла = Неопределено;

    Если Количество = 0 Тогда
        Заголовок = "У товара нет картинок";
    Иначе
        ИндексКартинки = Индекс;
        ЭлементСписка = ФайлыКартинок[Индекс];
        // Ложь: если файл потерян, вернётся Неопределено, а не исключение
        ДанныеФайла = РаботаСФайлами.ДвоичныеДанныеФайла(ЭлементСписка.Значение, Ложь);
        Заголовок = СтрШаблон("%1 (%2 из %3)", ЭлементСписка.Представление, Индекс + 1, Количество);
    КонецЕсли;

    Превью = РаботаСКартинками.УменьшеннаяКопия(ДанныеФайла);
    АдресКартинки = РаботаСКартинками.АдресДляПоля(Превью, УникальныйИдентификатор, АдресКартинки);

КонецПроцедуры

&НаКлиенте
Процедура Следующая(Команда)

    Количество = ФайлыКартинок.Количество();
    Если Количество > 1 Тогда
        ПоказатьКартинкуПоИндексу((ИндексКартинки + 1) % Количество);
    КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура Предыдущая(Команда)

    Количество = ФайлыКартинок.Количество();
    Если Количество > 1 Тогда
        ПоказатьКартинкуПоИндексу((ИндексКартинки - 1 + Количество) % Количество);
    КонецЕсли;

КонецПроцедуры
  • Запрос берёт файлы товара без папок и помеченных на удаление, основную картинку ставит первой. РАЗРЕШЕННЫЕ пропускает файлы, закрытые ограничением доступа, вместо ошибки запроса.
  • Расширение сверяется через НРег: регистр букв в нём бывает разным, а к товару прикладывают и PDF.
  • РаботаСФайлами.ДвоичныеДанныеФайла читает данные и из базы, и из тома на диске. С параметром Ложь потерянный файл даёт Неопределено вместо исключения.
  • Смена картинки — один серверный вызов: прежний адрес удаляется, новый записывается в реквизит, и поле перерисовывается само, потому что изменилась строка адреса.
  • Галерею открывают из карточки командой с ОткрытьФорму и параметром Номенклатура, см. статью про открытие формы.

Масштаб: вписать в поле, реальный размер, увеличение

Уменьшенная копия на сервере экономит трафик и место в базе, а свойства поля меняют только отображение. Перечисление РазмерКартинки в тонком клиенте недоступно, а смена РазмерКартинки и Масштабировать на клиенте всё равно идёт через сервер, поэтому режим переключает серверная процедура, а Масштаб меняют на клиенте. Реквизит и поле в примере созданы из кода, как в расширении:

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    НовыеРеквизиты = Новый Массив;
    НовыеРеквизиты.Добавить(Новый РеквизитФормы("АдресКартинки", Новый ОписаниеТипов("Строка")));
    ИзменитьРеквизиты(НовыеРеквизиты);

    Поле = Элементы.Добавить("Картинка", Тип("ПолеФормы"));
    Поле.Вид = ВидПоляФормы.ПолеКартинки;
    Поле.ПутьКДанным = "АдресКартинки";
    Поле.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет;
    Поле.ТекстНевыбраннойКартинки = "Картинки нет";
    Поле.Ширина = 40;
    Поле.Высота = 15;
    Поле.РазмерКартинки = РазмерКартинки.Пропорционально;
    Поле.Гиперссылка = Истина;
    Поле.УстановитьДействие("Нажатие", "КартинкаНажатие");

КонецПроцедуры

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

&НаКлиенте
Процедура КартинкаНажатие(Элемент, СтандартнаяОбработка)

    СтандартнаяОбработка = Ложь;
    ПереключитьРазмерКартинки(); // щелчок: вписать в поле или показать 1:1

КонецПроцедуры

&НаСервере
Процедура ПереключитьРазмерКартинки()

    // перечисление РазмерКартинки в тонком клиенте недоступно — режим меняем на сервере
    Поле = Элементы.Картинка;
    Если Поле.РазмерКартинки = РазмерКартинки.Пропорционально Тогда
        Поле.РазмерКартинки = РазмерКартинки.РеальныйРазмер;
        Поле.Масштабировать = Истина; // полосы прокрутки и масштаб в контекстном меню
    Иначе
        Поле.РазмерКартинки = РазмерКартинки.Пропорционально;
        Поле.Масштабировать = Ложь;
        Поле.Масштаб = 100;
    КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура Увеличить(Команда)
    ИзменитьМасштаб(1.25);
КонецПроцедуры

&НаКлиенте
Процедура Уменьшить(Команда)
    ИзменитьМасштаб(0.8);
КонецПроцедуры

&НаКлиенте
Процедура ИзменитьМасштаб(Коэффициент)

    // Масштаб есть с 8.3.15: проценты к масштабу формы, по умолчанию 100
    Поле = Элементы.Картинка;
    Поле.Масштаб = Макс(25, Мин(400, Окр(Поле.Масштаб * Коэффициент)));

КонецПроцедуры
  • К реквизиту, добавленному через ИзменитьРеквизиты, обращайтесь ЭтотОбъект.АдресКартинки: присваивание по имени создаст локальную переменную, и поле останется пустым. Подробнее — в статье про программное изменение формы.
  • Масштабировать = Истина даёт полосы прокрутки для картинки, которая не помещается в поле, и команды масштаба в контекстном меню.
  • Масштаб (с 8.3.15) — дополнительный к масштабу формы масштаб картинки в процентах, по умолчанию 100. В режиме совместимости 8.3.6 и ниже его изменение игнорируется.

Типичные ошибки

  • Картинка мелькнула и пропала. Адрес получен без идентификатора формы, и значение удалилось после следующего вызова сервера. Передавайте УникальныйИдентификатор.
  • «Переменная не определена (РазмерКартинки)», «Тип не определен (ОбрабатываемаяКартинка)». Код написан в &НаКлиенте, а оба типа есть только на сервере и в толстом клиенте. Конструктор Новый Картинка(ДвоичныеДанные) не работает в веб-клиенте. Готовьте картинку и меняйте режим поля на сервере.
  • В колонке таблицы нет ни надписи, ни щелчка. Если поле картинки стоит колонкой таблицы формы, ТекстНевыбраннойКартинки не используется, а Гиперссылка игнорируется — так в синтакс-помощнике. Открытие картинки из строки делайте через событие таблицы Выбор (двойной щелчок или Enter).
  • Исключение при ПоместитьВоВременноеХранилище(Данные, Адрес). По этому адресу значение уже удалили, а для удалённого адреса метод генерирует исключение. Берите новый адрес, как АдресДляПоля.
  • Форма списка тормозит, память сервера растёт. На каждую строку создаётся новый адрес, старые живут до закрытия формы, на клиент идут фото по несколько мегабайт. Помогают удаление прежнего адреса, превью и обработчик ожидания.
  • В карточке номенклатуры УТ 11.4 — «Ошибка при чтении файла изображения». Этот текст форма ставит вместо картинки, когда РаботаСФайлами.ДанныеФайла завершилась исключением: данных файла нет ни в базе, ни в томе. Проверьте, доступен ли серверу каталог тома хранения файлов.

Частые вопросы

Как поставить картинку из библиотеки на кнопку или декорацию?

Присвойте элементу свойство Картинка: Элементы.Статус.Картинка = БиблиотекаКартинок.ДиалогВосклицание;. Общие картинки конфигурации доступны так же, по имени. Поле картинки и временное хранилище нужны для картинок из данных: файлов, хранилищ, присоединённых файлов.

Почему поле не перерисовалось, хотя картинка по адресу новая?

ПоместитьВоВременноеХранилище(Данные, Адрес) кладёт данные по прежнему адресу, и строка в реквизите не меняется. Вызовите на клиенте Элементы.Картинка.Обновить() — метод заново получает картинку для поля со строковыми данными. АдресДляПоля такой проблемы не создаёт: адрес каждый раз новый.

Как сохранить картинку из поля в базу?

Для реквизита-хранилища — в ПередЗаписьюНаСервере: ТекущийОбъект.Картинка = Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(АдресКартинки)). В УТ и КА картинку добавляют присоединённым файлом: РаботаСФайлами.ДобавитьФайл(ПараметрыФайла, АдресКартинки), параметры — из РаботаСФайлами.ПараметрыДобавленияФайла() с заполненными ВладелецФайлов, ИмяБезРасширения и РасширениеБезТочки. Так делает форма номенклатуры УТ 11.4 в ПослеЗаписиНаСервере для нового товара.

Как показать картинку по ссылке из интернета?

Скачайте её на сервере через HTTPСоединение и HTTPЗапрос, возьмите Ответ.ПолучитьТелоКакДвоичныеДанные() и передайте в АдресДляПоля. Перед этим проверьте данные через ЭтоКартинка: вместо картинки сайт может вернуть страницу с ошибкой.

Когда проще заказать

Превью в списке номенклатуры, галерея в карточке товара, пересжатие уже загруженных фото — небольшие доработки, но в типовой их делают расширением, чтобы не мешать обновлениям. Такие задачи берут исполнители раздела отчёты и обработки 1С. Опишите конфигурацию и что должно отображаться — разместите задачу, оценка бесплатная, ответ в течение рабочего дня.

По теме

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

Станьте частью сообщества!
Войдите или зарегистрируйтесь, и вы сможете участвовать в обсуждениях.


1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.