При выполнении группового перепроведения документов через стандартную обработку в платформе 1С:Предприятие 7.7 пользователи нередко сталкиваются с системным сообщением: «An invalid argument was encountered». После нажатия кнопки подтверждения сеанс программы наглухо зависает, перестает отвечать на запросы пользователя и аварийно завершает работу. Разберем детально, почему возникает данный сбой и как его устранить на уровне программного кода и системных настроек.
Проанализируем техническую природу ошибки. Текст «An invalid argument was encountered» генерируется не встроенным языком 1С, а библиотеками интерфейса Microsoft Foundation Classes (MFC) и Win32 API операционной системы. Ошибка характерна для серверных операционных систем (в частности, Windows Server 2003 и более новых версий) при работе в терминальных сессиях RDP. Сбой происходит в диалоговой форме обработки («Сервис» – «Обработка документов») при попытке переместить виды документов между списками выбранных и исключенных объектов (кнопки с перемещением стрелками). В исходном коде типовой обработки в этот момент вызывается метод СортироватьПоПредставлению() для элемента интерфейса СписокЗначений. Платформа 1С 7.7 некорректно транслирует системные индексы строк в элементы управления Windows, что приводит к критическому исключению.
Рассмотрим основной способ решения проблемы через конфигуратор или редактирование внешней обработки. Чтобы избежать интерфейсного сбоя MFC, необходимо исключить прямую сортировку визуального списка значений на форме либо заменить проблемный метод.
Разберем по шагам варианты программной корректировки:
СортироватьПоПредставлению(). Если для задачи не критичен строгий алфавитный порядок по строкам представления, заменим его на базовый метод Сортировать().Посмотрим на пример безопасной сортировки элементов списка через объект ТаблицаЗначений:
// Создаем временную таблицу для безопасной сортировки в памяти
ТЗ = СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("Значение");
ТЗ.НоваяКолонка("Представление", "Строка");
// Заполняем таблицу данными из исходного списка документов
Для Сч = 1 По СписокДокументов.РазмерСписка() Цикл
ТЗ.НоваяСтрока();
ТЗ.Значение = СписокДокументов.ПолучитьЗначение(Сч);
ТЗ.Представление = СписокДокументов.Получить(Сч);
КонецЦикла;
// Сортируем строки в таблице значений по представлению
ТЗ.Сортировать("Представление+");
// Переносим результат обратно в экранный список значений
СписокДокументов.УдалитьВсе();
Для Сч = 1 По ТЗ.КоличествоСтрок() Цикл
ТЗ.ПолучитьСтрокуПоНомеру(Сч);
СписокДокументов.ДобавитьЗначение(ТЗ.Значение, ТЗ.Представление);
КонецЦикла;
Если конфигурация находится на поддержке или нет возможности оперативно внести изменения в программный код, разберем обходные варианты действий для пользователей и администраторов:
1cv7s.exe и 1cv7.exe включим режим совместимости с Windows 2000 или Windows XP SP3. Это переключает механизмы отрисовки общих элементов управления Windows и снижает вероятность вызова исключений MFC.Если типовая обработка продолжает вызывать системные ошибки в терминальной среде, рассмотрим штатные и внешние альтернативы: