Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
21 ноя 2024, 14:35

Задача №1. Решение и обсуждение.

Автор progmikon, 02 дек 2010, 14:16

0 Пользователей и 2 гостей просматривают эту тему.

progmikon

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

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

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

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

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

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

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


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

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


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

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

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


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

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


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


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

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

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


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


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

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

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

diggas

спасибо автору. Хороший материал для начинающих.

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск