Текст запроса значение реквизита единицы измерения

УПП. Получить единицы по классификатору(запрос).

Я
   Dirk Diggler

04.01.10 — 07:23

Есть некий список номенклатуры, в таблице значений МерныеМатериалы.

Как мне получить все ОБЩИЕ для этого списка единицы измерения(по классификатору)?

Максимум на что меня хватило — просто получить список единиц.

   Запрос.Текст=»ВЫБРАТЬ

       |    ТЗ.Номенклатура КАК Ссылка

       |ПОМЕСТИТЬ ВТ

       |ИЗ

       |    &ТабНоменклатура КАК ТЗ

       |;

       |

       |////////////////////////////////////////////////////////////////////////////////

       |ВЫБРАТЬ

       |    РАЗЛИЧНЫЕ ЕдиницыИзмерения.ЕдиницаПоКлассификатору КАК единица,

       |    ВТ.Ссылка КАК номенклатура

       |ИЗ

       |    Справочник.ЕдиницыИзмерения КАК ЕдиницыИзмерения

       |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ КАК ВТ

       |        ПО (ВТ.Ссылка = ЕдиницыИзмерения.Владелец)»;

   Запрос.УстановитьПараметр(«ТабНоменклатура», МерныеМатериалы);

  

Партнерская программа EFSOL Oblako

   Rie

1 — 04.01.10 — 07:30

(0) А почему бы не

ВЫБРАТЬ РАЗЛИЧНЫЕ
   ЕдиницыИзмерения.ЕдиницаПоКлассификатору КАК Единица
ИЗ
   Справочник.ЕдиницыИзмерения КАК ЕдиницыИзмерения
ГДЕ
   ЕдиницыИзмерения.Владелец В (&СписокНоменклатуры)

   Dirk Diggler

2 — 04.01.10 — 07:33

Кажись пробовал, нельзя. Там запрос должен быть.

Кроме того, этот запрос тоже даст ВСЕ единицы. А мне нужны только общие. Допустим, в списке есть листы железа —  которые меряются на «кг» и «м2», и пенопласт — «кг» и «м3». Результат должен содержать только единицу по классификатору «кг».

   Rie

3 — 04.01.10 — 07:42

Что-нибудь вроде СЧЕТЧИК равен количеству элементов номенклатуры.
Сейчас попробую запрос набросать.

   Rie

4 — 04.01.10 — 08:20

(2) Всё же непонятно, что значит «там запрос должен быть»?

ВЫБРАТЬ
   ЕдиницыИзмерения.ЕдиницаПоКлассификатору
ИЗ
   Справочник.ЕдиницыИзмерения КАК ЕдиницыИзмерения
СГРУППИРОВАТЬ ПО
   ЕдиницыИзмерения.ЕдиницаПоКлассификатору
ИМЕЮЩИЕ
   КОЛИЧЕСТВО(*)=&ВсегоНоменклатурыВТаблице

даст тебе именно общие, если ВсегоНоменклатурыВТаблице=Таблица.КоличествоСтрок()
(и строки в таблице не повторяются)

   Dirk Diggler

5 — 04.01.10 — 11:06

(4) после «в» должен стоять вложенный запрос. А по топику — заработало, спасибо.

   Запрос.Текст=»ВЫБРАТЬ
                |    ТЗ.Номенклатура КАК Ссылка
                |ПОМЕСТИТЬ ВТ
                |ИЗ
                |    &ТабНоменклатура КАК ТЗ
                |;
                |
                |////////////////////////////////////////////////////////////////////////////////
                |ВЫБРАТЬ РАЗЛИЧНЫЕ
                |    ЕдиницыИзмерения.ЕдиницаПоКлассификатору КАК единица
                |ИЗ
                |    Справочник.ЕдиницыИзмерения КАК ЕдиницыИзмерения
                |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ КАК ВТ
                |        ПО (ВТ.Ссылка = ЕдиницыИзмерения.Владелец)
                |
                |СГРУППИРОВАТЬ ПО
                |    ЕдиницыИзмерения.ЕдиницаПоКлассификатору
                |
                |ИМЕЮЩИЕ
                |    КОЛИЧЕСТВО(*) = &ВсегоНоменклатурыВТаблице»;
   Запрос.УстановитьПараметр(«ТабНоменклатура», МерныеМатериалы);
   Запрос.УстановитьПараметр(«ВсегоНоменклатурыВТаблице», МерныеМатериалы.Количество());

   Dirk Diggler

6 — 06.01.10 — 05:51

блин, я тупой )))
Будь добер, разжуй, как оно работает:

КОЛИЧЕСТВО(*) = &ВсегоНоменклатурыВТаблице

  

Rie

7 — 06.01.10 — 05:57

КОЛИЧЕСТВО — подсчитывает свой аргумент (строки выборки) по группировкам.
ИМЕЮЩИЕ — оставляет те группировки, у которых результат подсчёта удовлетворяет условию.
Если данная единица есть у каждой номенклатуры — она в запросе появится столько раз, сколько номенклатуры указано. Если не у каждой — меньшее число раз.

А вот слово РАЗЛИЧНЫЕ ты зря добавил, IMHO.

Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование.
Фредерик Брукс-младший

Приветствую всех.

Предлагаю разобрать решение первой задачи. (https://forum-1c.ru/index.php?topic=5607.0)
Оно безусловно не единственно возможное, но такое решение выбрал я.

Адекватная критика, замечания, дополнения — приветствуются. Пишите или в личку, или просто оставляйте сообщения в этой теме.

Итак, начнем.

Чтобы не переключаться с одной темы на другую, продублирую условие задачи здесь:
«У производственного предприятия, в связи с расширением направлений деятельности, появилось большое количество новой номенклатуры. И у большей части этой номенклатуры базовая единица измерения «кг». А там где килограмм, там и что? Правильно, тонна. Собственно задача заключается в том, чтобы для номенклатуры, у которой в качестве базовой единицы измерения стоит килограмм, создать еще одну единицу измерения — тонна».

Давайте сначала определим по пунктам, что нам нужно сделать:
1. Найти номенклатуру, у которой в качестве базовой единицы измерения используется килограмм.
2. Добавить к единицам измерения этой номенклатуры тонну.

Давайте найдем всю номенклатуру, у которой базовая единица — килограмм. Как будем искать? Я думаю, запросом :).


КгКлассиф = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("кг");

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

Немного прокомментирую. Я ввел переменную «КгКлассиф», которая будет хранить ссылку на элемент, с наименованием «кг» в справочнике «КлассификаторЕдиницИзмерения». Она нам пригодится для того, чтобы в запросе сравнивать со значением реквизита «БазоваяЕдиницаИзмерения» справочника «Номенклатура», из которого мы собственно и будем получать данные.

В результате выполнения этого запроса мы получаем всю номенклатуру, у которой базовая единица измерения килограмм. То, что нам и нужно для выполнения первого пункта.

Казалось бы можно создавать новую единицу измерения? Но нет. Мы не торопимся, а немного порассуждаем.
А вдруг какой-то пользователь уже успел добавить новую единицу измерения к какой-то из номенклатур? И что у нас получится? Правильно, две одинаковые единицы измерения у одной номенклатуры, что нас не устраивает. Давайте подумаем, как нам получить номенклатуру, для которой уже создана едница измерения — тонна.
Как? Конечно запросом :).


ТоннаКлассиф = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("тонна");

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

Этим запросом мы получим всю номенклатуру, у которой уже есть единица измерения — тонна.
По поводу ключевого слова «РАЗЛИЧНЫЕ» в запросе — его можно и не использовать. Я исходил из предположения, что где-то есть номенклатура, у которой, ошибочно несколько раз заведена единица измерения — тонна.
Кроме того, хочу отметить, что владельцем справочника «ЕдиницыИзмерения» является справочник «Номенклатура», что вполне логично и нас устраивает, и собственно именно по этому мы его и используем для получения данных.
Теперь перед нами стоит задача: выбрать всю номенклатуру из первого запроса, но так, чтобы она не входила в результат второго. И снова запрос :).


КгКлассиф = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("кг");
ТоннаКлассиф = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("тонна");

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

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

здесь особо пояснять нечего. Слепили мы два запроса. :)
Теперь осталось дело за малым — создать новую единицу измерения для данной номенклатуры:


КгКлассиф = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("кг");
ТоннаКлассиф = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("тонна");

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

Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
НовыйЭлемент = Справочники.ЕдиницыИзмерения.СоздатьЭлемент();
НовыйЭлемент.Владелец = ВыборкаДетальныеЗаписи.Ссылка;
НовыйЭлемент.Коэффициент = 1000;
НовыйЭлемент.ЕдиницаПоКлассификатору =ТоннаКлассиф;
НовыйЭлемент.Наименование = ТоннаКлассиф.Наименование;
НовыйЭлемент.Записать();
КонецЦикла;

Параметры запроса в 1С 8.3 необходимы для оптимизации кода запроса. Параметры бывают простых типов, ссылочных типов, списочных типов, в виде таблиц значений. Чтобы объявить параметра в языке запроса используется символ «&» и название параметра, Например: &ДатаДокумента. Для вставки параметра в запрос, используется функция УстановитьПараметр().

Передача параметров простых типов в запросе в 1С 8.3:

&НаСервере
Процедура ПередачаПараметровПростыхТиповВЗапросе()// Создание отбора по поступлению материала за 2020 год
   
Запрос = Новый Запрос(«ВЫБРАТЬ
    |   Ссылка
    |ИЗ
    |   Документ.ПоступлениеМатериалов
    |ГДЕ
    |   Дата МЕЖДУ &НачДата И &КонДата
    |УПОРЯДОЧИТЬ ПО
    |   Дата ВОЗР»
);Запрос.УстановитьПараметр(«НачДата», ‘20200101000000’);
   
Запрос.УстановитьПараметр(«КонДата», ‘20201231235959’);РезультатЗапроса = Запрос.Выполнить(); Записи = РезультатЗапроса.Выбрать();
    Пока
Записи.Следующий() Цикл
       
// Обход результата запроса по каждой записи в полученной выборке
   
КонецЦикла;

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

Передача параметров ссылочных типов в запросе в 1С 8.3:

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

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

Передача параметров списочного типа в запросе в 1С 8.3:

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

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

Передача параметра в виде таблицы значений в запросе в 1С 8.3:

&НаСервере
Процедура ПередачаПараметраВВидеТаблицыЗначенийВЗапросе()// Создание отбора по материалам в соответствии с параметром в виде
    // комбинированной таблицы значений: «Срок Использования» и «Производитель»
   
ТЗ_СрокИсп_Произв = новый ТаблицаЗначений;
   
ТЗ_СрокИсп_Произв.Колонки.Добавить(«СрокИспользования», Новый ОписаниеТипов(«СправочникСсылка.КлассификаторСроковПИ»));
   
ТЗ_СрокИсп_Произв.Колонки.Добавить(«Производитель», Новый ОписаниеТипов(«СправочникСсылка.Контрагенты»));// «12 месяцев» + «Гомелькабель»
   
СтрокаТЗ = ТЗ_СрокИсп_Произв.Добавить();
   
СтрокаТЗ.СрокИспользования = Справочники.КлассификаторСроковПИ.НайтиПоНаименованию(«12 месяцев»);
   
СтрокаТЗ.Производитель = Справочники.Контрагенты.НайтиПоНаименованию(«Гомелькабель»);// «18 месяцев» + «Гомельстекло»
   
СтрокаТЗ = ТЗ_СрокИсп_Произв.Добавить();
   
СтрокаТЗ.СрокИспользования = Справочники.КлассификаторСроковПИ.НайтиПоНаименованию(«18 месяцев»);
   
СтрокаТЗ.Производитель = Справочники.Контрагенты.НайтиПоНаименованию(«Гомельстекло»);Запрос = Новый Запрос(«ВЫБРАТЬ
    |   Наименование,
    |   СрокИспользования,
    |   Производитель
    |ИЗ
    |   Справочник.Материалы
    |ГДЕ
    |   (СрокИспользования, Производитель) В (&СписокСочетаний)»
);Запрос.УстановитьПараметр(«СписокСочетаний», ТЗ_СрокИсп_Произв);РезультатЗапроса = Запрос.Выполнить(); Записи = РезультатЗапроса.Выбрать();
    Пока
Записи.Следующий() Цикл
       
// Обход результата запроса по каждой записи в полученной выборке
   
КонецЦикла;

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

Использование таблицы значений переданной в запрос как параметр в 1С 8.3:

&НаСервере
Процедура ИспользованиеТаблицыЗначенийПереданнойВЗапросКакПараметр()// Программное создание Таблицы Значений и передача её в запрос
   
ДрагМеталл = новый ТаблицаЗначений;
   
ДрагМеталл.Колонки.Добавить(«Название», Новый ОписаниеТипов(«Строка»));
   
ДрагМеталл.Колонки.Добавить(«РынЦена», Новый ОписаниеТипов(«Число»));НоваяСтрока = ДрагМеталл.Добавить();
   
НоваяСтрока.Название = «Золото»;
   
НоваяСтрока.РынЦена = 127.29;НоваяСтрока = ДрагМеталл.Добавить();
   
НоваяСтрока.Название = «Серебро»;
   
НоваяСтрока.РынЦена = 1.30;НоваяСтрока = ДрагМеталл.Добавить();
   
НоваяСтрока.Название = «Платина»;
   
НоваяСтрока.РынЦена = 62.00;НоваяСтрока = ДрагМеталл.Добавить();
   
НоваяСтрока.Название = «Родий»;
   
НоваяСтрока.РынЦена = 568.27;// Сперва выбираем данные во временную таблицу, а потом работаем как с обычной таблицей
   
Запрос = Новый Запрос(«ВЫБРАТЬ
    |   Название,
    |   РынЦена
    |ПОМЕСТИТЬ
    |   ВременнаяТаблица
    |ИЗ
    |   &ТаблицаДрагМеталлов КАК ДрагМеталлы
    |;
    |ВЫБРАТЬ
    |   Название,
    |   РынЦена
    |ИЗ
    |   ВременнаяТаблица
    |УПОРЯДОЧИТЬ ПО
    |   РынЦена УБЫВ»
);Запрос.УстановитьПараметр(«ТаблицаДрагМеталлов», ДрагМеталл);РезультатЗапроса = Запрос.Выполнить(); Записи = РезультатЗапроса.Выбрать();
    Пока
Записи.Следующий() Цикл
       
// Обход результата запроса по каждой записи в полученной выборке
   
КонецЦикла;

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

Обращение с помощью литерала ЗНАЧЕНИЕ (ПРЕДСТАВЛЕНИЕЗНАЧЕНИЯ) в запросе в 1С 8.3:

// Вместо параметров можно применять обращение к предопределенным данным конфигурации с помощью литерала ЗНАЧЕНИЕ
// (ПРЕДСТАВЛЕНИЕЗНАЧЕНИЯ). В качестве представления значений могут использоваться
// предопределенные данные справочников, планов видов характеристик,
// планов счетов, планов видов расчета, значение перечислений, пустые ссылки,
// значения точек маршрута, значения системных перечислений. Пример:

|ГДЕ НашаНоменклатура = ЗНАЧЕНИЕ(Справочник.Номенклатура.Гвоздь)
|
|ГДЕ НашаНоменклатура = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
|
|ГДЕ ТипТовара = ЗНАЧЕНИЕ(Перечисление.ВидыТоваров.Продукция)
|
|ГДЕ ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)
|
|ГДЕ ТочкаМаршрута = ЗНАЧЕНИЕ(БизнесПроцесс.Согласование.ТочкаМаршрута.Согласие)

💡 Шаблоны (готовые модели) кода 1С 8.3 с тегом #Запросы:

Copyright©, «Программист 1С в г.Минске», 14.06.2020

Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник

Слушатель курса Разработка и оптимизация запросов в 1С:Предприятие 8.3 столкнулся с трудностями при обращении к конкретному объекту непосредственно в запросе. С аналогичной задачей может столкнуться каждый, поэтому мы решили опубликовать вопрос слушателя и ответ тренера из Мастер-группы курса.

Вопрос

В самом начале курса было показано, как найти объект на встроенном языке, например, НайтиПоНаименованию или НайтиПоКоду и передать его в запрос через параметр. А можно ли обратиться к объекту прямо в запросе, не используя параметр. Например, найти номенклатуру, зная её точное название  или артикул?

Ответ тренера

Искать по произвольному реквизиту в запросе тоже можно, сравнивая значение этого реквизита с примитивными типами. Разумеется, значение реквизита так же должно иметь примитивный тип.

Выборка номенклатуры по конкретному значению артикула:

ВЫБРАТЬ
    Номенклатура.Ссылка
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Артикул = "Арт1234"

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

То есть, чтобы выбрать номенклатуру с единицей измерения “штука”, нельзя написать

Номенклатура.ЕдиницаИзмерения = "Шт" 

Правильным будет следующее условие:

Номенклатура.ЕдиницаИзмерения.Наименование = "Шт".

P.S.

Понимать, как работают запросы и уметь их строить — обязательный навык для всех, кто дорабатывает и внедряет 1С.

После курса Вы сможете:

  • Строить сложные запросы с несколькими источниками данных
  • Уверенно задействовать вложенные запросы и временные таблицы
  • Использовать встроенный язык для обработки результатов запроса
  • Учитывать особенности соединений и объединений нескольких таблиц.
  • Разрабатывать запросы на уровне задач Аттестации 1С:Специалист по платформе.

pluck
01.12.2014 16:54 Прочитано: 3156

Здравствуйте

Проблема состоит в следующем, нужно при заполнении макета проверять заполнена ли единица измерения в номенклатура в «списокЕдиницыИзмерения», то есть в поле с отбором по родителю, код представлен ниже. Код отрабатывает, но считает для всех полей, а нужно чтобы только для тех где в номенклатуре есть значение «шт» . Никак не могу разобраться, где то не там вывожу строку 

Код 1C v 8.2 УП

 Для Каждого Стр из СсылкаНаОбъект.Товары Цикл

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

Результат = Запрос.Выполнить().Выбрать();
СтрокаОбл.Параметры.НомерСтроки = н;
СтрокаОбл.Параметры.Код = Стр.Номенклатура.Код;
СтрокаОбл.Параметры.Товар = Стр.Номенклатура;
СтрокаОбл.Параметры.Количество = Стр.Количество;
СтрокаОбл.Параметры.ЕдиницаИзмерения = Стр.ЕдиницаИзмерения;

ЕдИзм = Неопределено;

Пока Результат.Следующий() Цикл
 ЕдИзм = Результат.Ссылка;
 Если ЕдИзм = Неопределено Тогда
Продолжить
Иначе
СтрокаОбл.Параметры.КолШт = Стр.Количество / ЕдИзм.Коэффициент;
КонецЕсли;
КонецЦикла;

ТабДок.Вывести(СтрокаОбл);
н = н + 1;
КонецЦикла;

Yandex
Возможно, вас также заинтересует

Реклама на портале

pluck
01.12.2014 16:55 Ответ № 1

И еще, значение во всех полях вводит одно и то же, то есть из первого поля где есть «шт» 

escritor
01.12.2014 17:33 Ответ № 2

так поставь условие в самом первом запросе, что нужно выводить номенклатуру только с ШТ, зачем еще при выводе номенклатуры делать запрос?

pluck
01.12.2014 17:37 Ответ № 3

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

этим запросом я повторил тот отбор и проверяю введено ли в список значение «шт» если да то делю количество на коэфф от шт если нет то нужно чтобы поле было пустое

вместо пустого поля он посчитал в первой номенклатура где есть шт и заполнил это в остальные, тоесть не прервал почему-то 

pluck
01.12.2014 18:13 Ответ № 4

решение — занулить параметр КолШт перед циклом «пока» 

pluck
01.12.2014 18:14 Ответ № 5

Вопрос закрыт!

Подсказка: Щелкнув по значку (справа от названия вопроса), вы получите список ответов на похожие вопросы!

МОВ

0 / 0 / 0

Регистрация: 14.08.2022

Сообщений: 3

1

Не получается рассортировать номенклатуру по единицам измерения

14.08.2022, 18:45. Показов 1237. Ответов 13

Метки нет (Все метки)


1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
Запрос=Новый Запрос;
    Запрос.Текст=  "ВЫБРАТЬ
    //|БазовыеЕдиницыИзмерения.Наименование КАК &ВыбЕдИзм
    |БазовыеЕдиницыИзмерения.Наименование КАК Наименование,
    |Номенклатура.Ссылка КАК Ссылка,
    |Номенклатура.ВерсияДанных КАК ВерсияДанных,
    |Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
    |Номенклатура.Родитель КАК Родитель,
    |Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
    |Номенклатура.Код КАК Код,
    |Номенклатура.Наименование КАК Наименование1,
    |Номенклатура.Артикул КАК Артикул,
    |Номенклатура.Вес КАК Вес,
    |Номенклатура.Весовой КАК Весовой,
    |Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры,
    |Номенклатура.ДоговорКонтрагента КАК ДоговорКонтрагента,
    |Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
    |Номенклатура.СтавкаНДС КАК СтавкаНДС,
    |Номенклатура.СтранаПроисхождения КАК СтранаПроисхождения,
    |Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
    |Номенклатура.УдалитьОбувнаяПродукция КАК УдалитьОбувнаяПродукция,
    |Номенклатура.КодВидаНоменклатурнойКлассификации КАК КодВидаНоменклатурнойКлассификации,
    |Номенклатура.ЧастичноеПогашение КАК ЧастичноеПогашение,
    |Номенклатура.КодТРУ КАК КодТРУ,
    |Номенклатура.Предопределенный КАК Предопределенный,
    |Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных,
    |Номенклатура.Представление КАК Представление
    |ИЗ
    |Справочник.Номенклатура КАК Номенклатура
    |   ЛЕВОЕ СОЕДИНЕНИЕ Справочник.БазовыеЕдиницыИзмерения КАК БазовыеЕдиницыИзмерения
    |   ПО Номенклатура.ЕдиницаИзмерения = БазовыеЕдиницыИзмерения.Ссылка
    |ГДЕ
    |   Номенклатура.ЭтоГруппа = ЛОЖЬ
    |   И БазовыеЕдиницыИзмерения.Наименование = &Наименование";    
    
    Запрос.УстановитьПараметр("наименование" ,наименование );
    
    РезультатЗапроса = Запрос.Выполнить();
    ВыборкаЗаписей = РезультатЗапроса.Выбрать(); 
    
    Пока ВыборкаЗаписей.Следующий() Цикл
        
        ГруппаПереноса= ЭтотОбъект.ГруппаНоменклатуры;
        
        СправочникОбъект = ВыборкаЗаписей.ПолучитьОбъект();
        СправочникОбъект.Родитель =  ГруппаПереноса;         
        
        СправочникОбъект.Записать();
        
    КонецЦикла ; 
КонецПроцедуры

Задание рассортировать номенклатуру по папкам, по единицам измерения , через внешнюю обработку

Группа создается, запрос в консоли отрабатывается, до точки останова в конце процедуры доходит, при выполнении не ругается, а номенклатура по папкам не разносится. Подскажите пожалуйста, что делаю не так



0



Аватар

1505 / 948 / 364

Регистрация: 31.05.2012

Сообщений: 3,333

14.08.2022, 20:07

2

Цитата
Сообщение от МОВ
Посмотреть сообщение

СправочникОбъект = ВыборкаЗаписей.ПолучитьОбъект();

И ошибки не было? Скорее всего выборка пустая.

1C
1
СправочникОбъект = ВыборкаЗаписей.Ссылка.ПолучитьОбъект();



0



0 / 0 / 0

Регистрация: 14.08.2022

Сообщений: 3

15.08.2022, 00:12

 [ТС]

3

Скорее всего что так
Попыталась посмотреть таблицу значений, через табло отладки, выдает структуру таблицы, а не результат выгрузки, не подскажите в чем может быть причина, в консоли запрос отрабатывает правильно, при работе обработки никаких ошибок не выдает вообще: cry:
По точке останова параметры в запрос передаются



0



1505 / 948 / 364

Регистрация: 31.05.2012

Сообщений: 3,333

15.08.2022, 06:29

4

в параметр что передается? и почему отбор по наименованию единицы измерения, а не по ссылке? и левое соединение не нужно было бы в запросе тогда



0



Yulunga

1142 / 689 / 203

Регистрация: 22.04.2013

Сообщений: 5,159

Записей в блоге: 1

15.08.2022, 07:06

5

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Запрос=Новый Запрос;
Запрос.Текст= "ВЫБРАТЬ
|Номенклатура.Ссылка КАК Ссы
|ИЗ
|Справочник.Номенклатура КАК Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.БазовыеЕдиницыИзмерения КАК БазовыеЕдиницыИзмерения
| ПО Номенклатура.ЕдиницаИзмерения = БазовыеЕдиницыИзмерения.Ссылка
|ГДЕ
| Номенклатура.ЭтоГруппа = ЛОЖЬ
| И БазовыеЕдиницыИзмерения.Наименование = &Наименование";
 
Запрос.УстановитьПараметр("наименование" ,наименование );
 
Выборка = Запрос.Выполнить().Выбрать(); 
 
пока ВыборкаЗаписей.Следующий() цыкл
 
Объ = Выборка.Ссы.ПолучитьОбъект();
Объ.Родитель = ЭтотОбъект.ГруппаНоменклатуры;
 
СправочникОбъект.Записать();
конеццыкла



0



1808 / 1228 / 442

Регистрация: 16.01.2015

Сообщений: 5,395

15.08.2022, 08:00

6

А зачем левое соединение со справочником Базовые Единицы? У номенклатуры есть реквизит ЕдиницаИзмерения с типом СправочникСсылка.БазовыеЕдиницы. Никаких соединений, на мой взгляд, не требуется. Только условие ГДЕ Номенклатура.ЕдиницаИзмерения = &ЕдиницаИзмерения



0



1142 / 689 / 203

Регистрация: 22.04.2013

Сообщений: 5,159

Записей в блоге: 1

15.08.2022, 08:41

7

polax, Аватар, то есть что в запросе есть

Цитата
Сообщение от МОВ
Посмотреть сообщение

|Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
|Номенклатура.Родитель КАК Родитель,
|Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
|Номенклатура.Код КАК Код,
|Номенклатура.Наименование КАК Наименование1,
|Номенклатура.Артикул КАК Артикул,
|Номенклатура.Вес КАК Вес,
|Номенклатура.Весовой КАК Весовой,
|Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры,
|Номенклатура.ДоговорКонтрагента КАК ДоговорКонтрагента,
|Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
|Номенклатура.СтавкаНДС КАК СтавкаНДС,
|Номенклатура.СтранаПроисхождения КАК СтранаПроисхождения,
|Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
|Номенклатура.УдалитьОбувнаяПродукция КАК УдалитьОбувнаяПродукция,
|Номенклатура.КодВидаНоменклатурнойКлассификации КАК КодВидаНоменклатурнойКлассификации,
|Номенклатура.ЧастичноеПогашение КАК ЧастичноеПогашение,
|Номенклатура.КодТРУ КАК КодТРУ,
|Номенклатура.Предопределенный КАК Предопределенный,
|Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных,
|Номенклатура.Представление КАК Представление

вас как-то устраивает, да? ))))))))))))))



0



1505 / 948 / 364

Регистрация: 31.05.2012

Сообщений: 3,333

15.08.2022, 09:17

8

Та кликнул ТС в конструкторе и потянуло все поля, делов то. Не эффективно конечно для целей задачки. Если она учебная то простительно, если же нет то беда ))



0



1808 / 1228 / 442

Регистрация: 16.01.2015

Сообщений: 5,395

15.08.2022, 09:36

9

Yulunga, Мое сообщение выше было продолжением твоего поста, точнее вопрос тебе. Извини, не поставил ник )))



0



1142 / 689 / 203

Регистрация: 22.04.2013

Сообщений: 5,159

Записей в блоге: 1

15.08.2022, 09:58

10

polax, а, понял
да, не подумал. не надо соединения
и ксате да. хотел совет написать ТС-у тоже забыл
делать условие по наименованию — «это очень плохая музыка»



0



0 / 0 / 0

Регистрация: 14.08.2022

Сообщений: 3

15.08.2022, 11:13

 [ТС]

11

Добрый день, высланный код тоже не работает
по условиям задачи
нужно создать внешнюю обработку которая раскидывает номенклатуру по папкам по единицам измерения
1 реквизит Справочник.Ссылка (Единицы Измерения)
2 реквизит Строка (Группа в которую нужно перекинуть)
Без обращения к справочнику Базовые Единицы Измерения у меня не получается связать параметр и Запрос

Код который скинули в ответах тоже не хочет работать Я уже голову сломала, сегодня нужно сдать контрольную, а я …..

Добавлено через 48 секунд
это в смысле я

Добавлено через 5 минут
Это моя первая контрольная я пока чайник чайник…..



0



Yulunga

1142 / 689 / 203

Регистрация: 22.04.2013

Сообщений: 5,159

Записей в блоге: 1

15.08.2022, 11:14

12

Цитата
Сообщение от МОВ
Посмотреть сообщение

Без обращения к справочнику Базовые Единицы Измерения у меня не получается связать параметр и Запрос

1C
1
2
3
4
5
6
7
блаблабла
Номенклатур­а.ЕдиницаИзм­ерения.наименование КАК ЕдиницаИзмер­енияНаименование
// тоже можно не писать, оно нам не нать.
блаблабла
| И Номенклатур­а.ЕдиницаИзм­ерения.Наименование = &Наименование";
 
Запрос.УстановитьПараметр("наименование" ,наименование );



0



polax

1808 / 1228 / 442

Регистрация: 16.01.2015

Сообщений: 5,395

15.08.2022, 16:14

13

В виде исключения, хотя и поздно уже:

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Запрос=Новый Запрос;
Запрос.Текст= "ВЫБРАТЬ
|Номенклатура.Ссылка КАК Ссылка,
|Номенклатура.ЕдиницаИзмерения.Наименование КАК ЕдиницаИмя 
|ИЗ
|Справочник.Номенклатура КАК Номенклатура
| Номенклатура.ЭтоГруппа = ЛОЖЬ
|";
 
РезультатЗапроса = Запрос.Выполнить();
ВыборкаЗаписей = РезультатЗапроса.Выбрать();
 
Пока ВыборкаЗаписей.Следующий() Цикл  
ГруппаПереноса = Справочники.Номенклатура.НайтиПоНаименованию(ВыборкаЗаписей.ЕдиницаИмя);   
Если ГруппаПереноса = Неопределено Тогда  
НовыйОбъект = Справочники["Номенклатура"].СоздатьГруппу();
НовыйОбъект.Наименование = ВыборкаЗаписей.ЕдиницаИмя;
НовыйОбъект.Записать();
КонецЕсли;
СправочникОбъект = ВыборкаЗаписей.Ссылка.ПолучитьОбъект();
СправочникОбъект.Родитель = ?(ГруппаПереноса = Неопределено, НовыйОбъект,ГруппаПереноса);
СправочникОбъект.Записать();
КонецЦикла ;



0



0 / 0 / 0

Регистрация: 08.03.2020

Сообщений: 3

20.09.2022, 22:05

14

polax, У Вас заработал данный код? У меня почему то внешняя обработка ни как не реагирует, на кнопку выполнить



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

20.09.2022, 22:05

14

1

2

Показывать по
10
20
40
сообщений

Новая тема

Ответить

kend

Дата регистрации: 05.05.2009
Сообщений: 95

1С:Предприятие 8.3 (8.3.4.437)
Управление торговлей, редакция 11.1 (11.1.4.14)

День добрый!
Подскажите, пожалуйста, кто в курсе.
В УТ есть документ «Реализация товаров и услуг», нужно из табличной части «Товары» получить распечатку —

«Товар» , «Количество» , «Единица измерения»
……..
……..

С Товаром и Количеством все понятно, а ЕдиницуИзмерения, как вытащить на печать?
В УТ 10.3 работал такой код в модуле документа

Код
 Для Каждого СтрокаТЧ из ЭтотОбъект.Товары Цикл
     сообщить(""+СтрокаТЧ.Номенклатура+"   "+СтрокаТЧ.Количество+"   "+СтрокаТЧ.ЕдиницаИзмерения);
 КонецЦикла;

В УТ 11 вместо ЕдиницыИзмерения — Упаковка, но из нее не получается вытащить никакие данные.

Prikum

активный пользователь

офлайн

Дата регистрации: 18.02.2002
Сообщений: 20842

kend, упаковка какой тип имеет?

kend

Дата регистрации: 05.05.2009
Сообщений: 95

В Конфигураторе — СправочникСсылка.УпаковкиНоменклатуры
В самой базе, в колонке «Упаковка» выходят Единицы измерения.

Пробовал в цикле вверху ставить СтрокаТЧ.Упаковка… и далее реквизиты, все-равно ничего на выходит

Prikum

активный пользователь

офлайн

Дата регистрации: 18.02.2002
Сообщений: 20842

kend, СтрокаТЧ.ЕдиницаИзмерения.Упаковка так что выходит?

kend

Дата регистрации: 05.05.2009
Сообщений: 95

Prikum,

В документе «РеализацияТоваровУслуг» в табличной части «Товары» нет реквизита «ЕдиницаИзмерения», он был в 10.3, а в УТ-11 его заменили на реквизит «Упаковка».
По крайней-мере в моей конфе такого реквизита нет.

kend

Дата регистрации: 05.05.2009
Сообщений: 95

Prikum,

Для каждого СтрокаТЧ из ЭтотОбъект.Товары цикл
сообщить(«»+СтрокаТЧ .Упаковка);
сообщить(«»+СтрокаТЧ .Упаковка.ЕдиницаИзмерения);
сообщить(«»+СтрокаТЧ .Упаковка.ЕдиницаИзмерения.Наименование);
сообщить(«»+СтрокаТЧ .Упаковка.ИмяПредопределенныхДанных);
сообщить(«»+СтрокаТЧ .Упаковка.Наименование);
конеццикла;

выходят все пустые строки, хотя в документе стоит единица — «шт»

kend

Дата регистрации: 05.05.2009
Сообщений: 95

Prikum,

Цикл
СтрокаТЧ.Номенклатура.ЕдиницаИзмерения;
Конеццикла

выдает «шт», но как-то это не правильно имхо….

Вьюн

Дата регистрации: 14.01.2007
Сообщений: 657

kend,
Если СтрокаТЧ.Упаковка = Справочник.УпаковкиНоменклатуры.ПустаяСсылка Тогда
Сообщить(СтрокаТЧ.Номенклатура.ЕдиницаИзмерения);
Иначе
Сообщить(СтрокаТЧ.Упаковка.Наименование)
КонецЕсли;

kend

Дата регистрации: 05.05.2009
Сообщений: 95

Вьюн,

Ну да, этот вариант четко отрабатывает, выдает — «шт».

Работает первое условие — Если СтрокаТЧ.Упаковка = Справочник.УпаковкиНоменклатуры.ПустаяСсылка Тогда….

но почему работает именно оно, ведь в документе в строке ясно указано — «шт».
т.е она то, что указано в документе не воспринимает как положено, а понимает, как пустую ссылку, и обращается затем к Номенклатуре и ее реквизиту.

Собственно, задача вывода на печать решена, но вопросов стало больше чем было…

Вьюн

Дата регистрации: 14.01.2007
Сообщений: 657

kend пишет:

Цитата
но почему работает именно оно, ведь в документе в строке ясно указано — «шт».

Не в документе, а на форме документа, где в этой колонке стоит группа колонок, которая состоит из Объект.Товары.Упаковка и Объект.Товары.Номенклатура.ЕдиницаИзмерения.

А в запросах для печати везде стоит:

Код
    |    ВЫБОР
    |        КОГДА ТаблицаТоваров.Упаковка = ЗНАЧЕНИЕ(Справочник.УпаковкиНоменклатуры.ПустаяСсылка)
    |            ТОГДА ТаблицаТоваров.Номенклатура.ЕдиницаИзмерения.Представление
    |        ИНАЧЕ ТаблицаТоваров.Упаковка.ЕдиницаИзмерения.Представление
    |    КОНЕЦ КАК ЕдиницаИзмеренияНаименование,

Понравилась статья? Поделить с друзьями:
  • Текст официального документа его основной реквизит
  • Текстиль на слонова в саратове часы работы магазин
  • Телевизор отключается через несколько часов работы
  • Телега продираться компания каюта перегорающий егэ
  • Телетай бизнес официальный сайт связь с оператором