При изучении разработки на платформе 1С по знаменитому учебнику М.Г. Радченко начинающие программисты часто сталкиваются с ситуацией, когда код вроде бы написан в точности по книге, но ожидаемого результата нет — в нашем случае, цена номенклатуры не подставляется автоматически при выборе товара в документе. Разберем детально, почему это происходит, какие "подводные камни" скрываются в коде и на какие настройки платформы нужно обратить внимание в первую очередь.
Первым делом проанализируем код, предоставленный в сообщении. Проблема часто кроется в невнимательности при написании имен переменных или параметров функций. Рассмотрим фрагмент кода в общем модуле, который вызывает затруднения:
Функция РозничнаяЦена(АктуальнаяДата, ЭлементНомшенклатуры) Экспорт
//Создать вспомогательный объект "Отбор".
Отбор = Новый Структура("Номенклатура", "ЭлементНоменклатуры");
//Получить актуальные значения ресурсов регистра.
ЗначенияРесурсов = РегистрыСведений.Цены.ПолучитьПоследнее(АктуальнаяДата, Отбор);
Возврат ЗначенияРесурсов.Цена;
КонецФункции
Выделим две критические ошибки, на которые указали участники форума:
Отбор = Новый Структура("Номенклатура", "ЭлементНоменклатуры"); значение "ЭлементНоменклатуры" взято в кавычки. Это превращает переменную в обычный текст. Программа пытается найти в регистре сведений товар, название которого буквально совпадает с текстом "ЭлементНоменклатуры", а не тот товар, который мы выбрали в документе.ЭлементНомшенклатуры (лишняя буква "ш"), а внутри функции используется ЭлементНоменклатуры. Для платформы 1С это две абсолютно разные переменные.Исправленный вариант функции в общем модуле должен выглядеть следующим образом:
Функция РозничнаяЦена(АктуальнаяДата, ЭлементНоменклатуры) Экспорт
// Исправлено: убраны лишние буквы и кавычки у переменной
Отбор = Новый Структура("Номенклатура", ЭлементНоменклатуры);
ЗначенияРесурсов = РегистрыСведений.Цены.ПолучитьПоследнее(АктуальнаяДата, Отбор);
Возврат ЗначенияРесурсов.Цена;
КонецФункции
Даже если код написан идеально, он может не сработать из-за неверных свойств самого объекта ОбщийМодуль. Проанализируем, как должны быть настроены свойства модуля (например, РаботаСоСправочниками), чтобы клиентское приложение могло получить данные с сервера:
Поскольку функция РозничнаяЦена обращается к РегистрыСведений, она обязательно должна выполняться на стороне сервера. Однако вызываем мы её из модуля формы документа в процедуре с директивой &НаКлиенте. Чтобы этот "мост" между клиентом и сервером заработал, в свойствах общего модуля необходимо установить галочки:
НоменклатураПриИзменении просто "не увидит" вашу функцию и выдаст ошибку при попытке обращения.Разберем ситуацию, когда код написан, ошибки исправлены, но при выборе товара в табличной части ничего не происходит. Велика вероятность, что процедура в модуле формы просто не привязана к самому элементу управления.
Проанализируем шаги для проверки этой связи:
ПереченьНоменклатуры поле Номенклатура.ПереченьНоменклатурыНоменклатураПриИзменении.Если поле пустое, то 1С "не знает", что при выборе товара нужно запускать ваш код. Нужно нажать на лупу и выбрать процедуру из списка.
Рассмотрим еще один важный момент, который часто упускают при изучении основ. Метод ПолучитьПоследнее возвращает структуру. Если в регистре сведений "Цены" нет записи для выбранного товара, то обращение к ЗначенияРесурсов.Цена вызовет фатальную ошибку, так как поле Цена будет отсутствовать в результате.
Выясним, как сделать код более надежным. Рекомендуется добавить проверку на наличие данных:
ЗначенияРесурсов = РегистрыСведений.Цены.ПолучитьПоследнее(АктуальнаяДата, Отбор);
Если ЗначенияРесурсов.Цена = Неопределено Тогда
Возврат 0; // Или другое значение по умолчанию
Иначе
Возврат ЗначенияРесурсов.Цена;
КонецЕсли;
Как справедливо заметили в обсуждении, на странице 258 учебника Радченко начинается обучение работе с отладчиком. Это самый мощный инструмент программиста. Проанализируем, как с его помощью найти причину отсутствия цены:
СтрокаТабличнойЧасти.Цена = ... в модуле формы.РозничнаяЦена.Отбор. Если там написано "ЭлементНоменклатуры" (в кавычках), значит, мы передаем текст вместо ссылки на товар.ЗначенияРесурсов. Если там пусто, значит, в регистре сведений на дату документа просто нет цен для этого товара.Важный нюанс: Обратите внимание на дату документа. Если цены в регистр введены, например, 01.01.2024, а дата документа 31.12.2023, то метод ПолучитьПоследнее ничего не найдет, так как он ищет срез на указанный момент времени в прошлом.
Таким образом, для успешного выполнения примера необходимо проверить три составляющие: синтаксическую чистоту кода (отсутствие опечаток и лишних кавычек), настройки прав доступа к функции в общем модуле (Вызов сервера) и фактическое наличие данных в регистре сведений на нужную дату.