Реклама на этом месте
Форум 1С
Форум 1С
Программистам. Бухгалтерам. Администраторам. Пользователям
Задай вопрос - получи решение проблемы. Без троллинга и флуда.
13 Дек 2017, 21:58
МультиВход
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?
 
collapse

Автор Тема: Задача №1. Решение и обсуждение.  (Прочитано 5238 раз)

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

Оффлайн progmikon

  • *****
  • Сообщений: 2090
  • РЕПУТАЦИЯ: 371
  • КПД: 18%
  • Регистрация: 2010-10-09
  • Компания: http://progmikon.blogspot.com/
  • Профессия: Программист 1С
Приветствую всех.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


Оффлайн diggas

  • *
  • Сообщений: 3
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2011-07-09
  • Сайт: 
  • Профессия: Программист 1С
спасибо автору. Хороший материал для начинающих.


Теги:
 


* Живое общение

Не устроил ответ?

Зарегистрируйся и задай свой вопрос. Живое общение приносит результат намного быстрее.


Зарегистрироваться

* Реклама

* Поиск

* Последние задачи на разработку (фриланс)

* Реклама

* Последние вакансии

* Топ 10 авторов за месяц

Геннадий ОбьГЭС Геннадий ОбьГЭС
179 Сообщений
ilyay ilyay
75 Сообщений
oleg-x
51 Сообщений
alex0402
49 Сообщений
andron81_81
39 Сообщений
AIFrame
37 Сообщений
MuI_I_Ika MuI_I_Ika
34 Сообщений
BuhRust
30 Сообщений
Golickoff Golickoff
28 Сообщений
Dima Dddd Dima Dddd
26 Сообщений

* Кто онлайн

  • Точка Гостей: 330
  • Точка Скрытых: 0
  • Точка Пользователей: 3
  • Точка Сейчас на форуме:

* Облако тэгов

* Форум 1С с мобильного

* Инструменты

* Дополнительно

Поиск

 
SimplePortal 2.3.5 © 2008-2012, SimplePortal