Имя: Пароль:
1C
1С v8
Объясните мне эту лабуду!
,
0 mzelensky
 
28.03.12
09:05
Доброго времени суток! Конфа УТ 10.3 ... довольно старый релиз. Документ "Установка типов цен по номенклатурным группа для покупателей". Процедура

"ПроверитьПересекающиесяДокументы(Отказ, Заголовок)"


И там текст (ТИПОВОЙ):

Запрос = Новый Запрос;

   Запрос.УстановитьПараметр("ДокументСсылка", Ссылка);
   Запрос.УстановитьПараметр("ПустойТипЦен", Справочники.ТипыЦенНоменклатуры.ПустаяСсылка());
   Запрос.УстановитьПараметр("Дата", Дата);
   Запрос.УстановитьПараметр("Контрагент", Контрагент);

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

   ТЗ = Запрос.Выполнить().Выгрузить();

   ТЗ.Колонки.Добавить("ДатаОкончания");
   ТЗ.ЗаполнитьЗначения('00010101' ,"ДатаОкончания");

   КоличествоСтрок = ТЗ.Количество() - 1;
   Для Тмп = 0 По КоличествоСтрок Цикл
       СтрокаТЗ = ТЗ[КоличествоСтрок - Тмп];

       Если НЕ ЗначениеЗаполнено(СтрокаТЗ.ТипЦен) Тогда
           Для Тмп1 = 0 По ТЗ.Количество() -1 Цикл
               СтрокаПоиска = ТЗ[Тмп1];

               Если СтрокаПоиска.Группа = СтрокаТЗ.Группа
                  И НЕ ЗначениеЗаполнено(СтрокаПоиска.ДатаОкончания) Тогда
                   СтрокаПоиска.ДатаОкончания = СтрокаТЗ.ДатаНачала;
                   ТЗ.Удалить(СтрокаТЗ);
                   Прервать;
               КонецЕсли;
           КонецЦикла;
       КонецЕсли;
   КонецЦикла;


Этот кусок кода направлен на выявление пересекающихся периодов по одной номенклатурной группе для одного контрагента. Вот объясните мне, это я ТУПЛЮ или это действительно сделано как-то через *опу!?!
1 Axel2009
 
28.03.12
09:13
почему через опу?
2 Defender aka LINN
 
28.03.12
09:15
Что-то я не припомню такого документа в УТ...
Может, конечно, это я ее уже забыл, но уж больно название подозрительное
3 mzelensky
 
28.03.12
09:17
(2) почему подозрительное? Вот имя из конфы:

"УстановкаТиповЦенПоГруппамНоменклатурыДляПокупателей"

Конфа "(10.3.1.17)", нов более поздних он тоже есть.
4 mzelensky
 
28.03.12
09:18
(1) во-первых зачем в запросе вот это:

|        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СпрНоменклатура
   |        ПО (Док.Ссылка = &ДокументСсылка)
   |            И (СпрНоменклатура.НоменклатурнаяГруппа = Док.НоменклатурнаяЦеноваяГруппа
   |                ИЛИ СпрНоменклатура.ЦеноваяГруппа = Док.НоменклатурнаяЦеноваяГруппа)

Во-вторых зачем проверка через 2 таблицы значений:

ТЗ = Запрос.Выполнить().Выгрузить();

   ТЗ.Колонки.Добавить("ДатаОкончания");
   ТЗ.ЗаполнитьЗначения('00010101' ,"ДатаОкончания");

   КоличествоСтрок = ТЗ.Количество() - 1;
   Для Тмп = 0 По КоличествоСтрок Цикл
       СтрокаТЗ = ТЗ[КоличествоСтрок - Тмп];

       Если НЕ ЗначениеЗаполнено(СтрокаТЗ.ТипЦен) Тогда
           Для Тмп1 = 0 По ТЗ.Количество() -1 Цикл
               СтрокаПоиска = ТЗ[Тмп1];

               Если СтрокаПоиска.Группа = СтрокаТЗ.Группа
                  И НЕ ЗначениеЗаполнено(СтрокаПоиска.ДатаОкончания) Тогда
                   СтрокаПоиска.ДатаОкончания = СтрокаТЗ.ДатаНачала;
                   ТЗ.Удалить(СтрокаТЗ);
                   Прервать;
               КонецЕсли;
           КонецЦикла;
       КонецЕсли;
   КонецЦикла;

Таже отладчиком этот код крайне тяжело понять!
5 Шурик71
 
28.03.12
09:27
Искать неохота, но 1с не дает в своих конфах переменным имена Тмп, тмп1.
По их стандартам не проходят :)
6 DJ Anthon
 
28.03.12
09:34
почему, счетчикам вполне могут дать
7 Aleks73
 
28.03.12
09:35
v8: Абстрактный вопрос по УТ
якобы такой документ есть
8 hhhh
 
28.03.12
09:40
(5) сейчас проверил в типовой УТ: такой документ есть, и переменная тмп1 тоже есть.
9 mzelensky
 
28.03.12
09:41
(7) не совсем понял к чему это
10 mzelensky
 
28.03.12
09:42
(5) я уверен ,что это типовой док и процедура тоже типовая!
Ну дело не в этом...как эту фигню переделать под нормальный, удобочитаемый код
11 mzelensky
 
28.03.12
09:48
ну так что, люд?! какие предложения?
12 Aleks73
 
28.03.12
09:48
(9) к (2)
13 Aleks73
 
28.03.12
09:49
(11) Переделаю по внятному ТЗ. Строго в выходные. Дорого.
14 mzelensky
 
28.03.12
09:50
Для начала переделал запрос:

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

Сейчас немного посижу, попробую понять все-таки принцип тех таблиц и их обходов, если мне НЕ ПОНРАВИТСЯ - буду переделывать полностью...
15 mzelensky
 
28.03.12
09:54
(13) за дорого я тебе ее сам сделаю и не в выходные, а в течении этого дня.
16 hhhh
 
28.03.12
09:57
(15) но вообще-то глупо. Зачем переделывать?
17 Reset
 
28.03.12
09:59
(14) Угрожаешь? :)
18 mzelensky
 
28.03.12
10:15
(15) потому что в некоторые моменты эта штука работает ошибочно! Пересечения периодов нет ,а она говорит ,что есть!
19 mzelensky
 
28.03.12
10:16
(17) неее, просто хотел совета спросить ,как лучше переделать
20 Serg_1960
 
28.03.12
10:17
(14) Это неравнозначная замена типовой.

Навскидку (особо не думая): проверь работу запросов, если в документе указаноНапример: если в документе указаны группы, которые не использует справочник номенклатуры.
21 mzelensky
 
28.03.12
10:43
(20) мне такое условие не нужно.
22 DJ Anthon
 
29.03.12
07:35
(18) как-то курсовая у меня была курсе на третьем на пересечение периодов. надо было упорядочить произвольное расписание сторожей с их наименьшими трудозатратами. все работало, делал сам (тогда с инетом были напряги), но преподу объяснить сложный алгоритм не смог, ввиду абсолютно непросветной тупости первого. за что и получил три, хотя даже графику подключал и асмовские вставки были, а другие пять за тупую консольную обработку массивов получали, вот тогда я уже понял, что жисть несправедлива... ;)