Коллеги, с которыми мы работаем над задачами по автоматизации и развитию систем на платформе 1С:Предприятие, нередко сталкиваются с ситуациями, когда обновление платформы, призванное улучшить производительность и стабильность, неожиданно приводит к новым, порой неочевидным проблемам. Одной из таких проблем, проявившихся после перехода на платформу 1С:Предприятие версии 8.3.21, в частности на релиз 8.3.21.1302, стало некорректное отображение содержимого таких важных объектов, как таблицы значений (ТЗ) и табличные части (ТЧ) непосредственно в режиме отладки. Вместо ожидаемых данных, в строках и колонках таблицы отображается сообщение "Расчет значения", что делает полноценный просмотр, анализ или выгрузку данных затруднительным или даже невозможным. Давайте подробнее рассмотрим эту проблему и выясним, как ее можно решить.
Мы выяснили, что данная ситуация связана с изменениями, которые были реализованы в работе платформы 8.3.21. Разработчики 1С внедрили новую логику динамического считывания или порционного получения данных для больших таблиц в отладчике. Изначальная цель этих изменений заключалась в улучшении производительности: при работе с объемными данными платформа должна была избегать длительных зависаний, подгружая информацию по частям. Однако, на практике, как мы видим, это может приводить к тому, что отображение данных становится некорректным. В некоторых случаях мы наблюдаем, что отображается только часть данных, а остальное по-прежнему обозначается как "Расчет значения", или же выгрузка данных происходит "криво", то есть с ошибками или неполноценно.
Это создает значительные трудности для программистов и разработчиков, которым необходимо отслеживать состояние данных в процессе выполнения кода. Отсутствие возможности наглядно увидеть содержимое ТЗ или ТЧ, особенно при отладке сложных алгоритмов или при анализе работы с большими объемами информации, существенно замедляет процесс разработки и поиска ошибок. Стоит отметить, что сами данные, скорее всего, в памяти хранятся корректно, проблема заключается именно в их визуализации в интерфейсе отладчика.
Одним из наиболее эффективных решений, которое мы можем применить для смягчения или полного устранения этой проблемы, является изменение протокола отладки. По умолчанию или в некоторых случаях, особенно при работе через специфические сетевые настройки, может использоваться протокол HTTP. Нам рекомендуется переключиться на протокол TCP/IP.
Давайте разберемся в различиях между этими двумя протоколами отладки в контексте 1С:Предприятия:
Как мы видим из анализа, проблема "выгружается криво" или "не отображается полностью" с большими таблицами может быть напрямую связана с ограничениями или особенностями работы HTTP-сервера отладки, который не справляется с передачей объема информации. Переход на TCP обеспечивает более "прямой" и, как правило, более надежный канал для обмена данными между отладчиком и ядром платформы.
Чтобы переключить протокол отладки, мы можем выполнить следующие шаги:
Нам необходимо настроить сервер 1С:Предприятия. Откройте консоль сервера 1С:Предприятия. Для каждого рабочего процесса (или для кластера в целом, если настройки применяются глобально) убедитесь, что в свойствах указан правильный порт для отладки по TCP. Часто используется порт 1560 или другой, который настроен на сервере.
Затем, в конфигураторе, перейдите в меню Отладка -> Подключение -> Настройка отладки. В открывшемся окне мы должны выбрать тип подключения "TCP/IP" и указать адрес сервера и порт, соответствующие настройкам сервера 1С:Предприятия. Убедимся, что галочка "Использовать HTTP-сервер отладки" (или аналогичная) снята.
Если мы работаем с файловой базой, то настройка еще проще. Запустите конфигуратор, перейдите в меню Отладка -> Подключение -> Настройка отладки. Здесь мы также выбираем тип подключения "TCP/IP" и обычно оставляем адрес "localhost" и порт по умолчанию (например, 1560), если нет специфических настроек.
Важный момент: После изменения настроек отладки мы можем столкнуться с необходимостью перезапустить сеансы отладки, а иногда и весь рабочий процесс сервера 1С:Предприятия, чтобы изменения вступили в силу. Также убедимся, что брандмауэр на сервере и клиентских машинах не блокирует выбранный TCP-порт для отладки.
Наш опыт показывает, что после перехода на TCP отладка "стало полегче" и "хотя бы все выводится". Это подтверждает, что данное решение значительно улучшает стабильность отображения данных в отладчике.
Как это часто бывает с новыми версиями программного обеспечения, первые релизы могут содержать ошибки или недоработки. Платформа 8.3.21.1302, на которую мы перешли, могла быть именно таким "ранним" релизом, где оптимизации по динамическому считыванию данных в отладчике были реализованы не до конца или имели свои изъяны. Часто разработчики 1С оперативно выпускают корректирующие подрелизы, где исправляют обнаруженные проблемы.
Нам настоятельно рекомендуют рассмотреть возможность обновления платформы до более позднего и, предположительно, более стабильного подрелиза, такого как 8.3.21.1393. В таких релизах уже могли быть внесены исправления, касающиеся именно корректности работы отладчика с большими объемами данных. Прежде чем внедрять такое обновление на продуктивном контуре, мы обязательно должны провести его тестирование на тестовом контуре, чтобы убедиться в отсутствии других регрессий и в том, что проблема с отображением ТЗ/ТЧ действительно решена.
Мы помним, что при каждом обновлении платформы, особенно на новую мажорную или минорную версию, важно ознакомиться с полным списком изменений и исправлений, который предоставляется 1С. Это поможет нам понять, какие именно аспекты были улучшены и какие потенциальные риски могут быть связаны с обновлением.
В случаях, когда ни смена протокола, ни обновление платформы не дают желаемого результата, или если нам необходимо быстро получить фактические данные ТЗ/ТЧ, минуя проблемы с их визуализацией в интерфейсе отладчика, мы можем использовать программные методы.
Мы можем временно модифицировать код, вставляя в него инструкции для сохранения содержимого проблемной таблицы значений или табличной части во внешний файл. Это позволяет нам получить данные в структурированном виде и проанализировать их вне отладчика. Рассмотрим, как мы можем это сделать:
Для сохранения ТаблицыЗначений в файл Excel, мы можем использовать стандартные объекты 1С:
// Предположим, у нас есть ТаблицаЗначений с именем МояТаблицаЗначений
Перем МояТаблицаЗначений;
// ... код, который заполняет МояТаблицаЗначений ...
// Создаем объект COM для работы с Excel
Попытка
Excel = Новый COMОбъект("Excel.Application");
Исключение
Сообщить("Не удалось запустить Excel. Проверьте установку.");
Возврат;
КонецПопытки;
Excel.Visible = Истина; // Сделать Excel видимым
Книга = Excel.Workbooks.Add();
Лист = Книга.Sheets(1);
// Выводим заголовки колонок
Для Каждого КолонкаТЗ Из МояТаблицаЗначений.Колонки Цикл
Лист.Cells(1, КолонкаТЗ.Имя).Value = КолонкаТЗ.Имя; // КолонкаТЗ.Имя - это индекс колонки
КонецЦикла;
// Выводим данные
Для НомерСтроки = 0 По МояТаблицаЗначений.Количество() - 1 Цикл
СтрокаТЗ = МояТаблицаЗначений[НомерСтроки];
Для Каждого КолонкаТЗ Из МояТаблицаЗначений.Колонки Цикл
Лист.Cells(НомерСтроки + 2, МояТаблицаЗначений.Колонки.Индекс(КолонкаТЗ.Имя) + 1).Value = СтрокаТЗ[КолонкаТЗ.Имя];
КонецЦикла;
КонецЦикла;
// Автоматически подбираем ширину колонок
Excel.Columns.AutoFit();
// Сохраняем книгу
ПутьКФайлу = ПолучитьИмяВременногоФайла(".xlsx");
Попытка
Книга.SaveAs(ПутьКФайлу);
Сообщить("Данные сохранены в файл: " + ПутьКФайлу);
Исключение
Сообщить("Ошибка при сохранении файла Excel: " + ОписаниеОшибки());
КонецПопытки;
// Закрываем Excel
Excel.Quit();
Если же мы хотим сохранить данные в текстовый файл, например, в формате CSV, мы можем использовать следующий подход:
// Предположим, у нас есть ТаблицаЗначений с именем МояТаблицаЗначений
Перем МояТаблицаЗначений;
// ... код, который заполняет МояТаблицаЗначений ...
ПутьКФайлу = ПолучитьИмяВременногоФайла(".csv");
ТекстовыйДокумент = Новый ТекстовыйДокумент();
// Заголовки
СтрокаЗаголовков = "";
Для Каждого КолонкаТЗ Из МояТаблицаЗначений.Колонки Цикл
Если СтрокаЗаголовков <> "" Тогда
СтрокаЗаголовков = СтрокаЗаголовков + ";";
КонецЕсли;
СтрокаЗаголовков = СтрокаЗаголовков + "\"" + КолонкаТЗ.Имя + "\"";
КонецЦикла;
ТекстовыйДокумент.ДобавитьСтроку(СтрокаЗаголовков);
// Данные
Для Каждого СтрокаТЗ Из МояТаблицаЗначений Цикл
СтрокаДанных = "";
Для Каждого КолонкаТЗ Из МояТаблицаЗначений.Колонки Цикл
Если СтрокаДанных <> "" Тогда
СтрокаДанных = СтрокаДанных + ";";
КонецЕсли;
ЗначениеЯчейки = СтрокаТЗ[КолонкаТЗ.Имя];
Если ТипЗнч(ЗначениеЯчейки) = Тип("Строка") Тогда
ЗначениеЯчейки = СтрЗаменить(ЗначениеЯчейки, """", """"""); // Экранирование кавычек
СтрокаДанных = СтрокаДанных + "\"" + ЗначениеЯчейки + "\"";
ИначеЕсли ТипЗнч(ЗначениеЯчейки) = Тип("Дата") Тогда
СтрокаДанных = СтрокаДанных + Формат(ЗначениеЯчейки, "ДФ=yyyy-MM-dd HH:mm:ss");
Иначе
СтрокаДанных = СтрокаДанных + Строка(ЗначениеЯчейки);
КонецЕсли;
КонецЦикла;
ТекстовыйДокумент.ДобавитьСтроку(СтрокаДанных);
КонецЦикла;
Попытка
ТекстовыйДокумент.Записать(ПутьКФайлу, КодировкаТекста.UTF8);
Сообщить("Данные сохранены в файл: " + ПутьКФайлу);
Исключение
Сообщить("Ошибка при сохранении текстового файла: " + ОписаниеОшибки());
КонецПопытки;
Эти методы позволяют нам получить полный и корректный набор данных, несмотря на визуальные проблемы в отладчике. Мы можем использовать их как временное решение до того, как основная проблема с отладкой будет полностью устранена.
Мы понимаем, что переход на новые версии платформы 1С:Предприятие всегда сопровождается определенными рисками и требует тщательного тестирования. Платформа 8.3.21 действительно включала в себя ряд оптимизаций, направленных на повышение производительности, например, снижение нагрузки на процессоры клиентских компьютеров и улучшения в работе интерфейса. Однако, как мы видим, эти изменения могут повлечь за собой и непредвиденные побочные эффекты.
Важно помнить:
Совместными усилиями мы нашли эффективные пути решения проблемы с некорректным отображением таблиц значений и табличных частей в отладчике 1С:Предприятие 8.3.21. Изменение протокола отладки на TCP и обновление платформы до более стабильного подрелиза являются ключевыми шагами к восстановлению полноценной и комфортной работы с инструментом отладки.