В форме документа ЧекККМ написал код ,чтобы в РМК подтягивался остаток, при сканировании сканером. При создании товара, при указания штрих-кода вызывается эта процедура. Вполне возможно,что и в других документах и справочниках вызывается эта процедура
Как сделать так,чтобы эта процедура вызывалась только в форме документа ЧекККМ?

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

 Кусок с "ИмяФормы" можно закомментировать, он и так делается в контексте одной формы. на другие объекты не повлияет, тем более находясь в расширении.

Запрос в цикле, отбор в виртуальной таблице в условии ГДЕ, а не в параметрах таблицы... Надо переделать.

```1c
    &НаСервере
    Функция ПолучитьОстатки()
    СоответствиеОстатки = Новый Соответствие;

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

    Возврат СоответствиеОстатки;
    КонецФункции

    &НаКлиенте
    Процедура Расш1_ОбработкаОповещенияПосле(Источник, Событие, Данные)

    СоответствиеОстатки = ПолучитьОстатки();
    Для Каждого Строка Из Объект.Товары Цикл
    НайденнаяСтрока = СоответствиеОстатки.Получить(строка.Номенклатура);
    Если НайденнаяСтрока <> Неопределено Тогда
    Строка.Остаток = НайденнаяСтрока.Остаток;
    КонецЕсли;
    КонецЦикла;

    КонецПроцедуры
```

да и с периодом не совсем понятно, а значит и актуальность этих остатков под сомнением
---
сделайте оповещение с "уникальным" именем, и в обработке проверяйте,
```1c
    Если ИмяСобытия = "ВашВызовДляККМ" тогда
```
...
---
как сделать оповещение с уникальным именем? Это где нужно сделать?
---
Сейчас имя события= "SkanData"
---
SkanData пусть остается такое, для верности пройтись глобальным поиском в конфигурации (ctrl+shoft+f) по этому слову "SkanData", и убедиться, что в других доках нет проверки на это событие.
Оповещение то всё равно срабатывает для всех открытых форм, а там уже проверяется на имя события
---
в справочнике "номенклатура" точно срабатывает это событие. Не понял ,что нужно сделать,чтобы только для этой формы документа срабатывала
---
как уже писал:
 Оповещение то всё равно срабатывает для всех открытых форм, а там уже проверяется на имя события
значит в номенклатуре надо не голый текст в ОбработкеОповещения ставить, или приделать костыль вида " Если ИмяСобытия = "SkanData" тогда Возврат;".. а лучше покажите код в номенклатуре
---
там все стандартное. Там я ничего не трогал.
---
у меня тоже имя события = "SkqnData". Тогда вообще дальнейших код вообще не будет работать
---
т.е. у вас одинаковое имя события и в документе и в справочнике ? тогда можно вернуться к первому ответу, где надо поставить уникальное имя события, которое не встречается в других формах
---
как поставить уникальное имя события? Где ставить?
---
в самой форме Чека ККМ в обработке события разве нет кода по установке остатка ? То, что скан срабатывает в других формах это нормально.
---
типового кода?
Если эта процедура будет срабатывать в других формах, может же выводить ошибки
---
(13) эта процедура сам код с остатком должен находиться в форме этого документа ККМ,
где-нибудь в местах отмеченных желтым.
Тогда он точно не будет вызываться в номенклатуре.. А сканирование будет, так уж задумали разработчики УТ )
---
кода по получению остатка там нет
---
не знаю насколько правильно, по нашел такой выход:
Если ЭтотОбъект.ИмяФормы="Документ.ЧекККМ.Форма.ФормаДокументаРМК" Тогда
.....
КонецЕсли;
---
где этот кусок кода вы пишете ? В начале темы было "В форме документа ЧекККМ написал код" , сейчас - что его там нет... не пойму.
---
вы имеете ввиду типовой код по получению остатка или мой код по получению остатка?
---
ваш код надо вписать, примерно, в ту часть, что я желтым отметил на рисунке выше.

(16) не знаю насколько правильно, по нашел такой выход:
Если ЭтотОбъект.ИмяФормы="Документ.ЧекККМ.Форма.ФормаДокументаРМК" Тогда
.....
КонецЕсли;
такой подход тоже сработает. но "цикл по всей таб части" надо бы переделать под 1 номенклатуру
---
сможете привести пример переделки цикла под 1 номенклатуру?
---
выложите код предшествующий (Если ЭтотОбъект.ИмяФормы="Документ.ЧекККМ.Форма.ФормаДокументаРМК" Тогда)
Надо смотреть контекст, что на входе, что дальше делается...
там, наверняка, заполняется текущая строка, или структура, которую можно дополнить остатком..
---
```1c
    &НаСервере
    Функция ПолучитьОстатки(Номенклатура)
    Запрос=Новый Запрос;
    Запрос.Текст="ВЫБРАТЬ
    | ТоварыНаСкладахОстатки.ВНаличииОстаток КАК Остаток
    |ИЗ
    | РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
    |ГДЕ
    | ТоварыНаСкладахОстатки.Номенклатура = &Номенклатура";
    Запрос.УстановитьПараметр("Номенклатура",Номенклатура);
    ТЗ=Запрос.Выполнить().Выгрузить();
    Возврат ТЗ[0].Остаток;
    КонецФункции

    &НаКлиенте
    Процедура Расш1_ОбработкаОповещенияПосле(Источник, Событие, Данные)
    Если ЭтотОбъект.ИмяФормы="Документ.ЧекККМ.Форма.ФормаДокументаРМК" Тогда
    Для Каждого Строка Из Объект.Товары Цикл
    Строка.Остаток=ПолучитьОстатки(Строка.Номенклатура);
    КонецЦикла;
    КонецЕсли;
    КонецПроцедуры
```
---
вижу у вас расширение своё, и этот код находится в форме "ФормаДокументаРМК" внутри расширения.. если так то можно

 Кусок с "ИмяФормы" можно закомментировать, он и так делается в контексте одной формы. на другие объекты не повлияет, тем более находясь в расширении.

Запрос в цикле, отбор в виртуальной таблице в условии ГДЕ, а не в параметрах таблицы... Надо переделать.

```1c
    &НаСервере
    Функция ПолучитьОстатки()
    СоответствиеОстатки = Новый Соответствие;

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

    Возврат СоответствиеОстатки;
    КонецФункции

    &НаКлиенте
    Процедура Расш1_ОбработкаОповещенияПосле(Источник, Событие, Данные)

    СоответствиеОстатки = ПолучитьОстатки();
    Для Каждого Строка Из Объект.Товары Цикл
    НайденнаяСтрока = СоответствиеОстатки.Получить(строка.Номенклатура);
    Если НайденнаяСтрока <> Неопределено Тогда
    Строка.Остаток = НайденнаяСтрока.Остаток;
    КонецЕсли;
    КонецЦикла;

    КонецПроцедуры
```

да и с периодом не совсем понятно, а значит и актуальность этих остатков под сомнением
---
Если закомментировать кусок с "ИмяФормы" эта процедура начинает вызываться с справочника номенклатура.
У вас в коде нет Остаток находится в "Найденная Строка", а не в "НайденаяСтрока.Остаток". У Найденная Строка "Остаток" вообще нет
Это не чревато ошибками? Может в НайденнаяСтрока будет передаваться не остаток , а кое-что другое. Тогда выдаст ошибку или будет показывать не корректный "Остаток"
---
по идее она не должна вызываться там. Тогда верните кусок с имяФормы.
Да, там опечатка, должна быть просто "НайденнаяСтрока", можно её переименовать в Остаток. Что-то другое не будет передаваться, кроме того, что выдаст этот запрос. К одной номенклатуре - один остаток, если не нашёл остатка в соответствии тогда ничего не установится.
---
спасибо