При оформлении складских и учетных документов в конфигурациях на обычных формах (в частности, в 1С:Бухгалтерии для Украины 1.2 и аналогичных решениях линейки 1С:Бухгалтерия 2.0) пользователи нередко сталкиваются с ситуацией, когда в окне подбора номенклатуры флажок «Запрашивать цену» недоступен для редактирования или перенесенные цены не отображаются в документе. Разберем по шагам, почему возникает эта блокировка и как программно включить доступность запроса цен и их видимость в табличной части документа.
Проанализируем учетную и платформенную механику работы формы подбора. Поведение формы подбора зависит от параметров, которые передаются в нее из вызывающего документа:
СписаниеТоваров при списании с оптового склада не требует указания цен, так как себестоимость рассчитывается платформой автоматически при проведении документа (по методу ФИФО или средней стоимости). Колонки с ценами и суммами по умолчанию скрыты для оптовых складов и активируются только для неавтоматизированных или розничных торговых точек (НТТ).ЕстьЦена = Истина, флажок цены блокируется и становится неактивным для пользователя.Ложь.Рассмотрим модуль формы документа (например, СписаниеТоваров). За вызов окна подбора обычно отвечает процедура ДействиеПодбор или аналогичная обработка нажатия кнопки командной панели. Найдем процедуру инициализации подбора и проверим формирование структуры параметров.
В типовом варианте для оптового склада параметр ЕстьЦена устанавливается в значение Ложь или не передается вовсе. Изменим это поведение, принудительно указав истинность параметра:
Процедура ДействиеПодбор(ТабличнаяЧасть)
// Формирование структуры параметров для формы подбора
СтруктураПараметров = Новый Структура;
СтруктураПараметров.Вставить("ЕстьЦена", Истина);
// При необходимости можно явно передать тип цен
Если ЗначениеЗаполнено(ТипЦен) Тогда
СтруктураПараметров.Вставить("ТипЦен", ТипЦен);
КонецЕсли;
// Вызов универсальной формы подбора
ОбработкаПодбораНоменклатуры = Обработки.ПодборНоменклатуры.Создать();
ОбработкаПодбораНоменклатуры.ОткрытьФормуПодбора(ЭтотОбъект, ТабличнаяЧасть, СтруктураПараметров);
КонецПроцедуры
После передачи ЕстьЦена = Истина форма подбора разблокирует флажок запроса цен, и диалоговое окно начнет запрашивать цену у пользователя либо подтягивать ее из периодического регистра сведений ЦеныНоменклатуры.
Разберем следующий важный момент: при возврате подобранных позиций в табличную часть Товары введенная цена должна быть видна на форме. В модуле формы документа найдем процедуру обновления видимости колонок (обычно это УстановитьВидимость или ПриОткрытии).
Посмотрим на типовой фрагмент, управляющий отображением цен и сумм в зависимости от типа склада:
Если НТТ Тогда
// Поля суммы по документу и валюты для розничного склада
ЭлементыФормы.Всего.Видимость = Истина;
ЭлементыФормы.НадписьВсего.Видимость = Истина;
Колонки.Сумма.Видимость = Истина;
Колонки.Цена.Видимость = Истина;
Колонки.Цена.ТекстШапки = НСтр("ru='Розн. цена (';uk='Роздр. ціна ('") + мВалютаРегламентированногоУчета + ")";
Иначе
ЭлементыФормы.Всего.Видимость = Ложь;
ЭлементыФормы.НадписьВсего.Видимость = Ложь;
Колонки.Сумма.Видимость = Ложь;
Колонки.Цена.Видимость = Ложь;
КонецЕсли;
// Включаем принудительную видимость колонки цены для всех типов складов
Колонки.Цена.Видимость = Истина;
Если необходимо, чтобы в документе также отображалась итоговая сумма по каждой строке, аналогичным образом включаем видимость для колонки Колонки.Сумма.Видимость = Истина.
Выясним, как данные из подбора попадают в табличную часть. В модуле формы документа за перенос данных отвечает процедура ОбработкаПодбора или ОбработкаВыбора.
Убедимся, что при заполнении строки таблицы значения цены и суммы не затираются условием проверки типа склада. Проверим наличие следующего кода:
Процедура ОбработкаПодбора(СтруктураПодбора, ТабличнаяЧасть)
// Добавление новой строки или поиск существующей
СтрокаТабличнойЧасти = ТабличнаяЧасть.Добавить();
СтрокаТабличнойЧасти.Номенклатура = СтруктураПодбора.Номенклатура;
СтрокаТабличнойЧасти.Количество = СтруктураПодбора.Количество;
// Заполняем цену из переданной структуры подбора
Если СтруктураПодбора.Свойство("Цена") И ЗначениеЗаполнено(СтруктураПодбора.Цена) Тогда
СтрокаТабличнойЧасти.Цена = СтруктураПодбора.Цена;
КонецЕсли;
// Расчет суммы строки
СтрокаТабличнойЧасти.Сумма = СтрокаТабличнойЧасти.Количество * СтрокаТабличнойЧасти.Цена;
КонецПроцедуры
Цена и Сумма физически присутствуют в табличной части объекта конфигурации, а не добавлены исключительно на форму. В противном случае при записи документа введенные значения цен не сохранятся в базе данных.