При разработке на платформе 1С:Предприятие 7.7 программисты часто сталкиваются с выбором между двумя методами объекта ФС (Файловая Система) для открытия диалога выбора файлов: ВыбратьФайл() и ВыбратьФайлКартинки(). На первый взгляд кажется, что специализированный метод для картинок должен быть удобнее и функциональнее, однако на практике он часто ведет себя непредсказуемо, особенно в современных операционных системах, таких как Windows 7, 10 или 11. Рассмотрим подробнее, в чем заключаются их технические различия, и разберем причины нестабильной работы.
Для начала проанализируем, как эти методы взаимодействуют с операционной системой. Оба метода являются программной оболочкой (wrapper) над стандартной функцией Windows API под названием GetOpenFileName, которая находится в системной библиотеке comdlg32.dll.
Метод ВыбратьФайл() вызывает стандартное окно выбора. Он максимально прост и передает управление операционной системе, которая отрисовывает диалог в соответствии со своими текущими настройками. В современных ОС этот диалог автоматически поддерживает эскизы (thumbnails), поиск и другие удобства проводника.
Метод ВыбратьФайлКартинки() — это более сложная конструкция. При его вызове 1С использует флаг OFN_ENABLETEMPLATE. Это означает, что платформа пытается «внедрить» в стандартное окно Windows свой собственный графический шаблон, разработанный еще во времена Windows 95/98. Этот шаблон добавляет справа область предварительного просмотра и флажок «Предварительный просмотр».
Рассмотрим пример кода, который часто вызывает затруднения у разработчиков:
// Пример нестабильной работы метода
Если ФС.ВыбратьФайлКартинки(0, НоваяКартинка, КатЗагрКартинки, "Выберите файл картинки", "jpg", 10) = 1 Тогда
// Файл выбран
КонецЕсли;
В данном примере используется шестой параметр — Таймаут (в секундах). Именно здесь кроется одна из главных причин проблем.
Разберем ситуацию, описанную в сообщениях форума. Программисты заметили, что при использовании ВыбратьФайлКартинки() с установленным таймаутом окно предпросмотра исчезает через указанное время, а сам метод начинает возвращать 0, даже если пользователь нажимает кнопку «Открыть».
Выясним причину такого поведения. Таймаут в 1С 7.7 реализован через внутренний таймер приложения. В обычном диалоге ВыбратьФайл() по истечении времени система просто закрывает окно. Однако в ВыбратьФайлКартинки() создается дополнительный поток для отрисовки графики в окне превью. По истечении таймаута происходит следующее:
0.Важный вывод: Параметр таймаута в методах выбора файлов в 1С 7.7 работает некорректно и может приводить к логическим ошибкам, когда окно остается открытым, но результат выбора игнорируется.
Проанализируем, почему ВыбратьФайлКартинки() считается устаревшим. В эпоху Windows XP этот метод был полезен, так как стандартный проводник не всегда удобно отображал эскизы. Однако начиная с Windows 7 архитектура системных диалогов кардинально изменилась.
Когда 1С 7.7 пытается навязать свой старый шаблон 1998 года современному проводнику Windows, операционная система переключает окно диалога в режим «обратной совместимости». Это не только выглядит визуально чужеродно, но и создает дополнительную нагрузку на графическую подсистему. Происходит конфликт: 1С пытается отрисовать превью своими средствами, а Windows параллельно генерирует миниатюры файлов (thumbnails) своими методами.
Посмотрим на сравнение поведения методов в современных системах:
На основе опыта коллективного решения проблемы, сформулируем алгоритм действий для надежной работы программы:
ВыбратьФайлКартинки(). В 99% случаев он не дает никаких преимуществ перед стандартным ВыбратьФайл(), но вносит риски нестабильности.
Перем ИмяФайла, ПутьКФайлу;
ИмяФайла = "";
ПутьКФайлу = "C:\MyPictures\";
// Используем надежный метод
Если ФС.ВыбратьФайл(0, ИмяФайла, ПутьКФайлу, "Выберите изображение", "Рисунки (*.jpg;*.bmp;*.gif)|*.jpg;*.bmp;*.gif", , ) = 1 Тогда
ПолныйПуть = ПутьКФайлу + ИмяФайла;
// Дальнейшая обработка
КонецЕсли;
Мы выяснили, что основное отличие заключается в использовании устаревшего графического шаблона для предпросмотра в ВыбратьФайлКартинки(). Этот метод плохо совместим с многопоточностью современных ОС и имеет критический баг в обработке параметра Таймаут. Для обеспечения стабильной работы ваших решений на базе 1С 7.7 рекомендуется всегда использовать метод ВыбратьФайл(), предоставляя операционной системе возможность самостоятельно управлять отображением эскизов и процессом выбора.