|
Оптимизация кода? | ☑ | ||
---|---|---|---|---|
0
pro3ri
17.08.15
✎
11:58
|
доброго дня!
Как можно оптимизировать код? Делаю механизм чтобы бухи не могли выбирать групповые счета плана счетов. ТЗ = Выгрузить(); Для каждого СтрокаТЗ Из ТЗ Цикл Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Управленческий.Ссылка |ИЗ | ПланСчетов.Управленческий КАК Управленческий |ГДЕ | Управленческий.Родитель = &Родитель"; Запрос.УстановитьПараметр("Родитель", СтрокаТЗ.СчетДт); РезультатЗапроса = Запрос.Выполнить(); Если НЕ РезультатЗапроса.Пустой() Тогда СчетСДеревомДт = Истина; Иначе СчетСДеревомДт = Ложь; КонецЕсли; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Управленческий.Ссылка |ИЗ | ПланСчетов.Управленческий КАК Управленческий |ГДЕ | Управленческий.Родитель = &Родитель"; Запрос.УстановитьПараметр("Родитель", СтрокаТЗ.СчетКт); РезультатЗапроса = Запрос.Выполнить(); Если НЕ РезультатЗапроса.Пустой() Тогда СчетСДеревомКт = Истина; Иначе СчетСДеревомКт = Ложь; КонецЕсли; Если НЕ ЗначениеЗаполнено(СтрокаТЗ.СчетДт.Родитель) И СчетСДеревомДт Тогда Отказ = Истина; Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Нельзя указывать групповой счет в строке дебита № " + СтрокаТЗ.НомерСтроки; //Сообщение.Поле = ""; //Сообщение.УстановитьДанные(); Сообщение.Сообщить(); ИначеЕсли Не ЗначениеЗаполнено(СтрокаТЗ.СчетКт.Родитель) И СчетСДеревомКт Тогда Отказ = Истина; Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Нельзя указывать групповой счет в строке кредита № " + СтрокаТЗ.НомерСтроки; //Сообщение.Поле = ""; //Сообщение.УстановитьДанные(); Сообщение.Сообщить(); КонецЕсли; КонецЦикла; |
|||
1
zak555
17.08.15
✎
11:59
|
убрать запрос из цикла
|
|||
2
zak555
17.08.15
✎
12:00
|
запросом сразу получать счет или по дебету, или по кредиту
|
|||
3
Aswed
17.08.15
✎
12:00
|
(1) Убрать ДВА запроса из цикла.
|
|||
4
ДенисЧ
17.08.15
✎
12:01
|
Ctrl-A, Del, Ctrl-S
|
|||
5
Aswed
17.08.15
✎
12:02
|
(4) А Ctrl-S это что?
|
|||
6
ДенисЧ
17.08.15
✎
12:02
|
(5) Волшебная кнопочка. Без неё оптимизации не будет
|
|||
7
DmitriyDI
17.08.15
✎
12:02
|
(5) сохранить)
|
|||
8
Aswed
17.08.15
✎
12:03
|
(7) Блин точно)
|
|||
9
Бубка Гоп
17.08.15
✎
12:06
|
||||
10
Kurbash
17.08.15
✎
12:07
|
проиндексируй ТЗ для скорости
|
|||
11
Kurbash
17.08.15
✎
12:08
|
+запрос из цикла убери
|
|||
12
cw014
17.08.15
✎
12:08
|
ШЕДЕВР
|
|||
13
cw014
17.08.15
✎
12:08
|
Скажите, а назачем тут запрос?
|
|||
14
zak555
17.08.15
✎
12:21
|
(13) 1с-ник просто обязан всюду использовать запросы
|
|||
15
Бубка Гоп
17.08.15
✎
12:22
|
(14) Желательно в цикле. Вложенным. В попытках.
|
|||
16
cw014
17.08.15
✎
12:23
|
(15) + обязательное создание временных таблиц без их уничтожения
|
|||
17
zak555
17.08.15
✎
12:23
|
(15) без циклом разумеется
|
|||
18
kosts
17.08.15
✎
12:30
|
(0) В типовых в плане счетов обычно встречается реквизит ЗапретитьИспользоватьВПроводках
|
|||
19
pro3ri
17.08.15
✎
12:59
|
(18) благодарю.,
(1) все как смог сделать это: ТЗ = Выгрузить(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Управленческий.Ссылка |ИЗ | ПланСчетов.Управленческий КАК Управленческий |ГДЕ | Управленческий.Родитель В(&Родитель)"; Массив = Новый Массив; Массив.Добавить(ТЗ.ВыгрузитьКолонку("СчетДт")); Запрос.УстановитьПараметр("Родитель", Массив); РезультатПустой = Запрос.Выполнить().Пустой(); Если РезультатПустой Тогда СчетаДтБезИерархии = Истина; Иначе СчетаДтБезИерархии = Ложь; КонецЕсли; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Управленческий.Ссылка |ИЗ | ПланСчетов.Управленческий КАК Управленческий |ГДЕ | Управленческий.Родитель В(&Родитель)"; Массив = Новый Массив; Массив.Добавить(ТЗ.ВыгрузитьКолонку("СчетКт")); Запрос.УстановитьПараметр("Родитель", Массив); РезультатПустой = Запрос.Выполнить().Пустой(); Если РезультатПустой Тогда СчетаКтБезИерархии = Истина; Иначе СчетаКтБезИерархии = Ложь; КонецЕсли; Для каждого СтрокаТЗ Из ТЗ Цикл Если НЕ ЗначениеЗаполнено(СтрокаТЗ.СчетДт.Родитель) И Не СчетаДтБезИерархии Тогда Отказ = Истина; Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "В строке табличной части № " + СтрокаТЗ.НомерСтроки + " в поле ""СчетДт"" нельзя указывать групповой счет!!!"; //Сообщение.Поле = ""; //Сообщение.УстановитьДанные(); Сообщение.Сообщить(); ИначеЕсли Не ЗначениеЗаполнено(СтрокаТЗ.СчетКт.Родитель) И Не СчетаКтБезИерархии Тогда Отказ = Истина; Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "В строке табличной части № " + СтрокаТЗ.НомерСтроки + " в поле ""СчетКт"" нельзя указывать групповой счет!!!"; //Сообщение.Поле = ""; //Сообщение.УстановитьДанные(); Сообщение.Сообщить(); КонецЕсли; КонецЦикла; |
|||
20
pro3ri
17.08.15
✎
13:01
|
а вот можно ли 1 запросом все сразу, только чтобы была указка на конкретную строку...
|
|||
21
kosts
17.08.15
✎
13:17
|
(20) Первым шагом, загоняешь в таблицу все счета, которые встречаются.
Вторым, делаешь запрос с отбором по этим счетам. Выгружаешь результат в ТЗ. Третьим, обходишь исходную таблицу и ищешь счет в результате запроса. |
|||
22
kosts
17.08.15
✎
13:23
|
(21) + Для ускорения результат запроса можно поместить в соответствие, т.к. оно индексируется.
|
|||
23
pro3ri
17.08.15
✎
14:01
|
(21) спасибо
ТЗ = Выгрузить(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Управленческий.Ссылка, | Управленческий.Родитель |ИЗ | ПланСчетов.Управленческий КАК Управленческий |ГДЕ | Управленческий.Родитель В(&Родитель)"; Массив = Новый Массив; Массив.Добавить(ТЗ.ВыгрузитьКолонку("СчетДт")); Массив.Добавить(ТЗ.ВыгрузитьКолонку("СчетКт")); Запрос.УстановитьПараметр("Родитель", Массив); ТЗЗапроса = Запрос.Выполнить().Выгрузить(); //Соответствие = Новый Соответствие; //Соответствие.Вставить(ТЗ, Запрос.Выполнить().Выгрузить()); Для каждого СтрокаТЗ Из ТЗ Цикл Если НЕ ЗначениеЗаполнено(СтрокаТЗ.СчетДт.Родитель) И ЗначениеЗаполнено(ТЗЗапроса.Найти(СтрокаТЗ.СчетДт)) Тогда Отказ = Истина; Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "В строке табличной части № " + СтрокаТЗ.НомерСтроки + " в поле ""СчетДт"" нельзя указывать групповой счет!!!"; Сообщение.Поле = "ДвиженияРегистрБухгалтерии1[СтрокаТЗ.НомерСтроки].СчетДт"; Сообщение.УстановитьДанные(ЭтотОбъект); Сообщение.Сообщить(); ИначеЕсли Не ЗначениеЗаполнено(СтрокаТЗ.СчетКт.Родитель) И ЗначениеЗаполнено(ТЗЗапроса.Найти(СтрокаТЗ.СчетКт)) Тогда Отказ = Истина; Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "В строке табличной части № " + СтрокаТЗ.НомерСтроки + " в поле ""СчетКт"" нельзя указывать групповой счет!!!"; Сообщение.Поле = "ДвиженияРегистрБухгалтерии1[СтрокаТЗ.НомерСтроки].СчетКт"; Сообщение.УстановитьДанные(ЭтотОбъект); Сообщение.Сообщить(); КонецЕсли; КонецЦикла; только с соответствием ничего не понял |
|||
24
kosts
17.08.15
✎
14:43
|
Что-то в этом роде
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |