Имя: Пароль:
1C
1С v8
v8: Не могу понять замысел разработчиков
,
0 mvgfirst
 
24.02.12
15:11
Конфигурация "Бухгалтерия для Украины (1.2.5.3)".
Документ "Начисление зарплаты работникам организаций".
Модуль документа. Процедура РасчитатьНачисленияПроводки...

Помогите понять смысл следующего фрагмента кода:


   Пока ВыборкаПоНачислениям.Следующий() Цикл
       
       ПроверитьЗаполнениеСтрокиНачисления(ВыборкаПоНачислениям, Отказ);
       Отказ = Ложь;
       Если НЕ Отказ Тогда
           // Заполним записи в наборах записей регистров
           ДобавитьСтрокуНачислений(ВыборкаПоНачислениям, ВыборкаПоШапкеДокумента, НаборОсновныеНачисления);
       КонецЕсли;
       
   КонецЦикла;

А если более точно задать вопрос, то - Помогите понять зачем внутри цикла выполняется проверка?
1 le_
 
24.02.12
15:12
Отказ = Ложь;// - это тут явно лишнее
2 Fragster
 
гуру
24.02.12
15:13
тема ПроверитьЗаполнениеСтрокиНачисления(ВыборкаПоНачислениям, Отказ); не раскрыта
3 Irbis
 
24.02.12
15:14
Шоб було, наверное недописали кусочек перед проверкой, в следующий релиз воткнут.
4 mvgfirst
 
24.02.12
15:17
Процедура выполняет последовательно проверку заданных в тексте процедуры условий, выводит сообщение об ошибки по каждому из сработавших условий и устанавливает "Отказ" в ИСТИНА.
Но судя по всем делает она это (установку переменной) совершенно зря :)
Хотя я даже с этим могу согласится. Что может в конкретно этом месте и не надо было никому значение переменной Отказ возвращаемой из процедуры.
Но зачем проверять вот это:

Если НЕ Отказ Тогда

Неужели разработчики не уверены в том что пишут?
5 mvgfirst
 
24.02.12
15:20
Хотя буквально недели две назад мне на Хабре встречалась статья, об изощренном методе комментировать участки кода именно блоками Если 1=0 Тогда КонецЕсли. Но там были аргументы в том что при таком виде комментирования компилятор проверяет актуальность кода внутри этого блока, не выбрасывает его из скомпилированного файла и т.п.
Но 1С-негам это зачем? Да я врядли это именно результат раскомментирования ранее закоментированного куска.
6 mvgfirst
 
24.02.12
15:42
И еще помогите понять зачем в процедурах формирования запросов (практически в каждой)
Выполняется сначала инструкция:

Запрос.Текст = "ВЫБРАТЬ * ИЗ ВТПлановыеНачисления";

А затем какой-нибудь переменной типа ТекстОсновногоЗапроса присваивается более обширный текст запроса

после чего идет набор интсрукций:

Запрос.Текст = ТекстОсновногоЗапроса;
Выборка = Запрос.Выполнить();

Вот не могу понять с какой целью выполняется первое присовение текста запроса?

И если в процедуре происходит выполнение нескольких запросов - так поступают перед каждым запросом?
Это что? Очистка буфера? или еще что?
Почему не сделать тогда:

Запрос.Текст = "";

У меня такое впечатление что меня не допустили к некоторым "секретным знаниям" ...
7 mkanaev
 
24.02.12
15:53
Им платят за строки кода....
8 pumbaEO
 
24.02.12
15:59
(6) Я так понимаю, зарплатные запросы ты ни разу не отлаживал и понятие не имеешь про Виртуальный таблицы?
9 marvak
 
24.02.12
16:01
(6)
Имхо, это так называемые "заглушки", осталось от стадии разработки. Тут видимо делается так, чтобы запрос в любом случае имел какой то текст, даже если программист потом забыл его инициализировать нужным текстом.

Не обращай внимания.
10 mvgfirst
 
24.02.12
16:06
(8)
Буду признателен если объясните как установка таких заглушек связана с Виртуальными таблицами?
Т.к. я с ними познакомился еще на 1С++, использовал где только можно и нельзя..
Да и в 8-ке писал запросы используя ВТ, но понять немогу с какой целью ставят эту заглушку. В документации по запросам мне ничего подобного не встречалось...
11 mvgfirst
 
24.02.12
16:11
(10) Я себе уже думал было так:
Если бы текст запроса присваивался локальной переменной, а потом бы эта переменная переинициализировалась новым текстом запроса - то налицо было бы "... неубранный мусор после отладки разработчиками...", но т.к. текст присваивают атрибуту объекта, может за этим скрыт некий тайный смысл инициализации приватных переменных объекта или еще какая секретная комбинация подготовительных мероприятий.

Например, в этой же процедуре используется МенеджерВременныхТаблиц, и я подумал: А может это что бы Временные таблицы не уничтожались менеджером автоматически?! (хотя в документации поэтому менеджеру написано как раз обратное)....

Вот и спрашиваю, в чем тайный смысл использования таких "приёмчиков"?
12 pumbaEO
 
24.02.12
16:12
Ок, вот простой пример: в августе дорабатывал выбор правильной льготы для НДФЛ для матерей одиночек + 2 ребенка инвалида (1С забила на это случай и даже не учитывала этот вариант). Так вот мое вмешательство в общий модуль расчета было такое:
// Запрос.Текст = "ВЫБРАТЬ * ИЗ ВТЛьготыНДФЛ";
МояПроцедура(Запрос)
Запрос.Текст = "ВЫБРАТЬ * ИЗ ВТЛьгтыНДФЛНовые";

Красота, если бы это было все одним запросом сделано, то представь как бы мой еще доп. запрос нехилый потом  в обновлении смотрелся нехилого модуля расчета.
13 mvgfirst
 
24.02.12
16:17
(12) Т.е. товая "МояПроцедура(Запрос)" что делала? Выполняла запрос, который видимо складывал свой результат в одну из существующий (или новую) временную таблицу? Правильно я понимаю?
Не понимаю только одного: зачем инициализировать заново свойство объекта Запрос.Текст? Что это дает?
Таким образом разработчики очищают что-то внутри? Или как?
Когда собственно произойдет выполнение самого запроса?
В моих текстах (которые я сейчас исследую) перед выполнением текст запроса всегда устанавливается зановоо, и совершенно не тем текстом который был использован в заглушке.
14 Лефмихалыч
 
24.02.12
16:19
"        Отказ = Ложь;
       Если НЕ Отказ Тогда"

это пять
15 pumbaEO
 
24.02.12
16:49
Когда нибудь отладку делал этих немаленьких запросов? Подсистемой tormozit или другими консолями запросов для отладки?

Запрос.Текст = "ВЫБРАТЬ * ИЗ ВТЛьготыНДФЛ";

За этот текст, готов сказать спасибо разработчикам, не надо его вручную писать, прошел отладчиком строку
Запрос.Текст = "ВЫБРАТЬ * ИЗ ВТЛьготыНДФЛ";
Потом shift+f9 "Отладить(Запрос)" и открывается результат.

По поводу дороботки немного не там написал, идет:
Если Истина Тогда
ТекстЗапроса = ""
Запрос.Текст = ТекстЗапроса;
Запрос.Выполнить() // Вот здесь создаеться ВТ
И потом здесь свою процедуру ставил, что бы в запрос добавить необходимую ВТ
16 mvgfirst
 
24.02.12
17:02
Ага, т.е. это всего лишь заглушка что бы посмотреть содержимое ВТ? Что же, теперь то понятно....
Хотя, некрасиво, в типовых то конфигурациях такое оставлять :) (хотя это уже риторическое замечание)
17 pumbaEO
 
24.02.12
17:08
Некрасиво 1 процедуру в общем модуле на 10000 строк оставлять. Еще раз, раньше надо было писать этот код, теперь хоть в конце понятно, что это "Если Истина Тогда" много, много кода (запроса) должно вернуть.
18 mvgfirst
 
24.02.12
17:08
(15) А если эта строка будет закомментирована, ее нельзя будет использовать в том же отладчике?
(Простите сам не пользовал подсистему - потому и задаю, хотя вот теперь уверен что надо будет таки начать пользовать)
Ведь будь эти строке закомментированы - и не возникло бы у меня вопроса. Да мало ли что там пишут и с каким целями комментарий оставляют... а вот действующие конструкции языка - это уже начинает вызывать подозрения.
19 mvgfirst
 
24.02.12
17:09
(17) Не пойму о чем это Вы?
20 pumbaEO
 
24.02.12
17:16
(19) Модуль ПроведениеРасчетов, ошибся процедура всего на 3 тысячи строк.
Еще раз, отладчиком эту строку прошел и можно запускать отладчик запросов, ничего копировать не надо, писать и т.д. и т.п.
21 mvgfirst
 
24.02.12
17:26
(20) Умеешь ты запутать :)
22 YV
 
24.02.12
17:29
Отказ = Ложь;
явно отладочная строка, которую просто забыли удалить
23 YV
 
24.02.12
17:30
(22)+ Чтобы следующее за ней условие выполнялось всегда, независимо от состояния переменной Отказ.
24 mvgfirst
 
24.02.12
18:02
(20) Правильно ли я понимаю что конструкция

Если Истина Тогда
// неимеоверно длинный текст запроса
КонецЕсли

Ипользуется тоже только для возможности в конфигураторе свернуть по "+" и уменьшить длину этой простыни?
25 pumbaEO
 
24.02.12
18:20
Совершенно верно. А вот если будут такие конструкции
// {
 неимеоверно длинный текст запроса
//}

Тогда, будет печально.
26 mvgfirst
 
24.02.12
18:21
(25) А чо Снегопат - этого еще не делает разве?