Версия для печати темы (https://pro1c.org.ua/index.php?s=9df59bdd90c47ba492612f9f7d17c3f0&showtopic=36032)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 8.3 _ Отображение остатка по товару в чеке ККМ "на лету"

Автор: bobr_dobr 20.03.17, 15:46

Доброго дня, вопрос по платформе 8.3.5.1443 управляемые формы, конфигурация Управление небольшой фирмой для Украины, редакция 1.4.
Возникла необходимость сделать так, чтобы кассир видел остатки по номенклатуре на форме чека ККМ во время ее добавления (т.е. вместе с единицей измерения и ценой, которые заполняются из события ПриИзменении), потому что его не устраивает, когда он наполняет чек несколькими наименованиями, а потом чек не проводится, если есть нехватка на складе.
Контроль отрицательных остатков отключать не хотят.
В модуль формы документа событие ПриИзменении добавил

СтрокаТабличнойЧасти.Остаток =ОбщегоНазначения.РассчитатьОстаток(Объект.Организация,СтрокаТабличнойЧасти.Номенклатура,Объект.Дата);


в ОбщегоНазначенияКлиентСервер

&НаСервере

Функция РассчитатьОстаток(Организация,Номенклатура,Дата) Экспорт
    Запрос = Новый Запрос(
    "ВЫБРАТЬ
    |    ЗапасыОстатки.Организация,
    |    ЗапасыОстатки.Номенклатура,
    |    ЗапасыОстатки.КоличествоОстаток КАК Остаток
    |ИЗ
    |    РегистрНакопления.Запасы.Остатки(&МоментВремени, ) КАК ЗапасыОстатки
    |ГДЕ
    |    ЗапасыОстатки.Номенклатура = &Номенклатура
    |    И ЗапасыОстатки.Организация = &Организация"
    );
    Запрос.УстановитьПараметр("МоментВремени", Дата);
     Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
     Запрос.УстановитьПараметр("Организация", Организация);
    Результат = Запрос.Выполнить();
    а = Результат.Выгрузить();  
  
   КонецФункции


Отладку запускаю в толстом клиенте, но в результате запроса в табло не цифры, а то, что на скрине.

В консоли запросов все нормально, получаю остаток и остальные данные запроса.
Просьба подсказать, что не так сделал, ибо давно уже не ковырял конфигурации, тем более управляемые формы. А может вообще эта реализация кривая и есть более гуманные способы upset.gif

Автор: Vofka 20.03.17, 15:55

В вашем случае нужно смотреть либо переменную а, либо нужно открыть выборку по результату запроса:

Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
   Сообщить(Выборка.Остаток);
КонецЦикла;


Если же вы уверены, что в результате запроса будет максимум 1 строка, то можно так:
Выборка = Результат.Выбрать();
Если Выборка.Следующий() Тогда
   Сообщить(Выборка.Остаток);
Иначе
   Сообщить("Остатков нету");
КонецЕсли;

Автор: logist 20.03.17, 16:10

Ваша функция должна быть такой:

Функция РассчитатьОстаток(Организация,Номенклатура,Дата) Экспорт
    Запрос = Новый Запрос(
    "ВЫБРАТЬ
    |    ЗапасыОстатки.Организация,
    |    ЗапасыОстатки.Номенклатура,
    |    ЕСТЬNULL(ЗапасыОстатки.КоличествоОстаток, 0) КАК Остаток
    |ИЗ
    |    РегистрНакопления.Запасы.Остатки(
    |            &Дата,
    |            &Номенклатура = Номенклатура
    |                И &Организация = Организация) КАК ЗапасыОстатки"
    );
    Запрос.УстановитьПараметр("Дата",            Дата);
    Запрос.УстановитьПараметр("Номенклатура",    Номенклатура);
    Запрос.УстановитьПараметр("Организация",    Организация);
    Выборка = Запрос.Выполнить().Выбрать();
    Возврат ?(Выборка.Следующий(),Выборка.Остаток,0);  
  КонецФункции

Автор: bobr_dobr 20.03.17, 16:38

Vofka , logist, Ребят, огромное вам спасибо, крепкого здоровья вам smile.gif. Про параметры запроса забыл, каюсь, сейчас все заработало)

Автор: bobr_dobr 22.03.17, 12:39

Есть небольшие доработки. Отладку я запускал в толстом клиенте, а на рабочей базе запускается тонкий, код функции перенес в модуль ОбщегоНазначенияВызовСервера, и запрос должен брать остатки из регистра ЗапасыНаСкладах. Тогда в чеках ККМ будет отображаться актуальный остаток после каждого пробитого чека.

Автор: logist 22.03.17, 13:19

Цитата(bobr_dobr @ 22.03.17, 12:39) *
код функции перенес в модуль

Зачем вообще использовали общие модули, это же функция для одной формы, её можно было смело разместить в той же форме, предварив &НаСервереБезКонтекста

Автор: Vofka 22.03.17, 13:48

Цитата(logist @ 22.03.17, 13:19) *
это же функция для одной формы

Сейчас. А завтра, послезавтра...?

Автор: bobr_dobr 22.03.17, 15:32

logist @ Сегодня, 13:19 * ,
Я, к сожалению, уже не помню все эти тонкости, поэтому влепил в общий модуль. Освежал в памяти остатки знаний в процессе написания этой проверки smile.gif Ее действительно можно было разместить в форму, это не настолько крупная наработка и она только для чека ККМ делалась. Более широко используемые, универсальные, как говорил выше Vofka, уже лучше в общие модули добавлять. Еще раз благодарен вам за советы и поправки.

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua