При разработке и доработке конфигураций на платформе 1С:Предприятие 7.7 (например, «Торговля и Склад 9.2») разработчики часто сталкиваются с ситуацией, когда при обходе элементов подчиненного справочника стандартный метод получения наименования возвращает пустую строку. Кроме того, в процессе написания кода иногда возникает специфическая проблема операционной системы: при копировании текста кириллица превращается в набор знаков вопроса («??????»).
В этой статье мы подробно разберем обе проблемы, выясним их причины и рассмотрим правильные варианты решения.
Рассмотрим стандартную структуру метаданных конфигурации «Торговля и Склад 9.2». Справочник Комплектация является подчиненным по отношению к справочнику Номенклатура. В его структуре предусмотрены следующие реквизиты:
Номенклатура — реквизит типа Справочник.Номенклатура, содержащий ссылку на входящую в комплект позицию (комплектующее);Количество — числовой реквизит для указания количества;ЦеновойКоэфф — числовой реквизит для ценового коэффициента.Главная ошибка заключается в том, что у самого справочника Комплектация стандартный атрибут Наименование имеет длину 0 (он не используется для хранения текста). Когда в коде выполняется вызов спрКомплектация.ПолучитьАтрибут("Наименование") или прямой вызов спрКомплектация.Наименование, система возвращает пустую строку, так как наименование составной части хранится в отдельном реквизите Номенклатура.
Проанализируем исходный фрагмент кода и внесем необходимые исправления. Для обращения к наименованию комплектующего элемента следует обращаться к реквизиту Номенклатура и через точку получать его наименование.
Разберем правильный вариант написания процедуры с учетом проверки успешности поиска элемента:
Процедура Сформировать()
Перем спрНоменклатура, спрКомплектация;
спрНоменклатура = СоздатьОбъект("Справочник.Номенклатура");
спрКомплектация = СоздатьОбъект("Справочник.Комплектация");
// Проверяем результат поиска по коду
Если спрНоменклатура.НайтиПоКоду(Ввод_код, 0) = 1 Тогда
// Устанавливаем владельца для подчиненного справочника
спрКомплектация.ИспользоватьВладельца(спрНоменклатура.ТекущийЭлемент());
спрКомплектация.ВыбратьЭлементы();
Пока спрКомплектация.ПолучитьЭлемент() = 1 Цикл
// Обращаемся к реквизиту Номенклатура и его наименованию
Сообщить("Комплектующее: " + спрКомплектация.Номенклатура.Наименование);
Сообщить("Количество: " + спрКомплектация.Количество);
Сообщить("Коэффициент: " + спрКомплектация.ЦеновойКоэфф);
КонецЦикла;
Иначе
Предупреждение("Номенклатура с кодом " + Ввод_код + " не найдена!");
КонецЕсли;
КонецПроцедуры
Важные технические нюансы:
ПолучитьАтрибут("ИмяРеквизита") рекомендуется использовать прямое обращение через точку: спрКомплектация.Номенклатура. Это повышает readability кода и скорость работы.НайтиПоКоду(). Если функция возвращает 0, вызов метода ИспользоватьВладельца() с пустой ссылкой приведет к некорректной выборке.Вторая проблема, с которой часто сталкиваются разработчики в среде 1С 7.7 — искажение текста при вставке из буфера обмена, когда вместо русских букв появляются символы ??????.
Платформа 1С 7.7 использует кодировку ANSI (CP1251 для русской локализации). При операциях копирования и вставки Windows проверяет текущую активную раскладку клавиатуры и системные параметры кодовых страниц. Если в момент копирования или работы фонового процесса происходит сбой передачи идентификатора языкового контекста, кириллица преобразуется в знаки вопроса.
Основные причины и способы решения: