Оптимизация кода 1с, дополнительное обучение 1с.
Доброго дня.
Я ищу наставника, который готов помощь по моим вопросам 1с.
Мне нужно
1. Хотелось бы узнать, как можно оптимизировать код (именно с пояснениями, а не просто переписать код).
2. Посоветовать хорошую программу для обучения.
3. Я вижу свои пробелы в знании 1с и хотелось бы получить консультации только по интересующим вопросам.
Конечно же это за оплату.
Может быть есть у кого-то есть опыт программирования в 1с и желание быть наставником, то прошу Вас написать мне в личное сообщение для дальнейшего обсуждения.
Я ищу наставника, который готов помощь по моим вопросам 1с.
Мне нужно
1. Хотелось бы узнать, как можно оптимизировать код (именно с пояснениями, а не просто переписать код).
2. Посоветовать хорошую программу для обучения.
3. Я вижу свои пробелы в знании 1с и хотелось бы получить консультации только по интересующим вопросам.
Конечно же это за оплату.
Может быть есть у кого-то есть опыт программирования в 1с и желание быть наставником, то прошу Вас написать мне в личное сообщение для дальнейшего обсуждения.
По теме из базы знаний
- Методика оптимизации программного кода 1С: проведение документов
- Корпоративный мозг на 1С и Python
- Нанимаем программиста 1С – "прыжок веры" или грамотный набор
- Стек технологий для 1С
- Применение 1С:Аналитики и Дата акселератора, или Как получить в 1С прозрачность и скорость обработки данных для прямого доступа и контроля руководителя
Найденные решения
(1)При оптимизации кода важно понимать, что в итоге/какую именно оптимизацию вы хотите получить и за счет чего, а то может оказаться так, что и оптимизировать нечего.
Основные принципы оптимизации - сокращать количество вызовов функций/процедур/получения значений из БД, избавление от запросов в цикле.
Основные принципы оптимизации - сокращать количество вызовов функций/процедур/получения значений из БД, избавление от запросов в цикле.
(13)
Самое главное не делать это в цикле для каждой строки ТЧ.
Далее, определить объем данных на форме. Если форма не "тяжелая" (не много реквизитов и табличных частей и в ТЧ не много колонок), то можно просто сделать контекстный серверный вызов, в котором запросом получить нужные данные и заполнить нужную колонку ТЧ.
Вот если форма тяжелая и контекстный вызов делается долго и требует оптимизации, только тогда ищется другой способ. Не раньше. Не стоит все оптимизировать заранее усложняя код.
Как вариант, можно выбрать ссылки номенклатур и его передать на сервер без контекста. Но тогда придется получать нужные данные по цене и заполнять на клиенте.
2. Я бы сделала так
на клиенте
вызвала бы функцию реквизит номенклатуры
а на сервере делала бы запрос.
на клиенте
вызвала бы функцию реквизит номенклатуры
а на сервере делала бы запрос.
Самое главное не делать это в цикле для каждой строки ТЧ.
Далее, определить объем данных на форме. Если форма не "тяжелая" (не много реквизитов и табличных частей и в ТЧ не много колонок), то можно просто сделать контекстный серверный вызов, в котором запросом получить нужные данные и заполнить нужную колонку ТЧ.
Вот если форма тяжелая и контекстный вызов делается долго и требует оптимизации, только тогда ищется другой способ. Не раньше. Не стоит все оптимизировать заранее усложняя код.
Как вариант, можно выбрать ссылки номенклатур и его передать на сервер без контекста. Но тогда придется получать нужные данные по цене и заполнять на клиенте.
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)При оптимизации кода важно понимать, что в итоге/какую именно оптимизацию вы хотите получить и за счет чего, а то может оказаться так, что и оптимизировать нечего.
Основные принципы оптимизации - сокращать количество вызовов функций/процедур/получения значений из БД, избавление от запросов в цикле.
Основные принципы оптимизации - сокращать количество вызовов функций/процедур/получения значений из БД, избавление от запросов в цикле.
(3)
Да, я давно на этот форуме и по многим вопросам он мне сильно помог.
Я читаю различные материалы, ищу решения возникающих проблем.
Только бывает так, что не получается или получается не совсем оптимально.
Я не отказываюсь оплатить услуги и я ищу такого человека, который готов лично со мной позаниматься 1с 8.3.
Да, я давно на этот форуме и по многим вопросам он мне сильно помог.
Я читаю различные материалы, ищу решения возникающих проблем.
Только бывает так, что не получается или получается не совсем оптимально.
Я не отказываюсь оплатить услуги и я ищу такого человека, который готов лично со мной позаниматься 1с 8.3.
(4)в качестве обучения возьмите какой-то кусок кода, который по вашему мнению не является оптимальным, разместите его на форуме, можно даже в этой теме, коллективный разум вам даст некие советы по оптимизации конкретно этого кода.
Далее ваша задача интерполировать полученные знания на остальные случаи.
Далее ваша задача интерполировать полученные знания на остальные случаи.
Что не так в этом куске кода?)
&НаКлиенте
Процедура Один()
Товары = Документ.Товары;
Для Каждого Стр ИЗ Товары Цикл
Цена = РеквизитНоменклатуры(Стр.Номенклатура, "Цена");
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура РеквизитНоменклатуры(Номенклатура, ИмяРеквизита)
Возврат Номенклатура[ИмяРеквизита];
Конецпроцдуры
Показать
(9)так это надо от ТС увидеть код и обоснование его неоптимальности.
Дать некий "сферический код в вакууме" и попросить объяснить в чем его неоптимальность - такое себе, человек может еще и не знает, на что обращать внимание при поиске неоптимальных участков кода.
Дать некий "сферический код в вакууме" и попросить объяснить в чем его неоптимальность - такое себе, человек может еще и не знает, на что обращать внимание при поиске неоптимальных участков кода.
(12)
Вполне себе, только для чего - не понятно абсолютно, т.к. Документ.Товары(при условии, что Документ - это основной реквизит формы объекта) доступен на клиенте напрямую и нет особой необходимости присваивать это какой-либо переменной.
И вот не понятно - Документ.Товары - точно на клиенте? ;)
Вполне себе, только для чего - не понятно абсолютно, т.к. Документ.Товары(при условии, что Документ - это основной реквизит формы объекта) доступен на клиенте напрямую и нет особой необходимости присваивать это какой-либо переменной.
(11) Но почему же? Когда человек ищет ошибку, он думает, происходит мыслительные процессы. Когда ему просто аргументировать, он это просто примет как факт. Когда он подумает, и ему потом аргументируют - то будет и то и то. Так что не вижу в таком методе что то плохое)
(12) Мы говорим об абстрактном куске кода, придуманным за 10 секунд) Его практическое значение - показать пример куска кода)
(13) Да, процедура не возвращает значения) Но это была лишь крохотная ошибка)
(12) Мы говорим об абстрактном куске кода, придуманным за 10 секунд) Его практическое значение - показать пример куска кода)
(13) Да, процедура не возвращает значения) Но это была лишь крохотная ошибка)
(13)
Самое главное не делать это в цикле для каждой строки ТЧ.
Далее, определить объем данных на форме. Если форма не "тяжелая" (не много реквизитов и табличных частей и в ТЧ не много колонок), то можно просто сделать контекстный серверный вызов, в котором запросом получить нужные данные и заполнить нужную колонку ТЧ.
Вот если форма тяжелая и контекстный вызов делается долго и требует оптимизации, только тогда ищется другой способ. Не раньше. Не стоит все оптимизировать заранее усложняя код.
Как вариант, можно выбрать ссылки номенклатур и его передать на сервер без контекста. Но тогда придется получать нужные данные по цене и заполнять на клиенте.
2. Я бы сделала так
на клиенте
вызвала бы функцию реквизит номенклатуры
а на сервере делала бы запрос.
на клиенте
вызвала бы функцию реквизит номенклатуры
а на сервере делала бы запрос.
Самое главное не делать это в цикле для каждой строки ТЧ.
Далее, определить объем данных на форме. Если форма не "тяжелая" (не много реквизитов и табличных частей и в ТЧ не много колонок), то можно просто сделать контекстный серверный вызов, в котором запросом получить нужные данные и заполнить нужную колонку ТЧ.
Вот если форма тяжелая и контекстный вызов делается долго и требует оптимизации, только тогда ищется другой способ. Не раньше. Не стоит все оптимизировать заранее усложняя код.
Как вариант, можно выбрать ссылки номенклатур и его передать на сервер без контекста. Но тогда придется получать нужные данные по цене и заполнять на клиенте.
(18)
spacecraft, вот кусок моего рабочего кода.
Я вначале делаю запрос, проверяю, есть ли нужные данные и далее по выбранным данным создаю новые документы, далее заполняя табличную часть.
Это всё в цикле.
Подскажите пожалуйста, это верное и оптимальное решение или у Вас есть предложения, как улучшить??
Дополню ещё.
Если ещё и другой документ, который создаётся на основании первого документа.
С такими же полями и с такой же самое табличной частью.
И как можно в 1 запросе и цикле, в зависимости от условий создать и заполнить 2 документа.
Как можно сделать этот цикл
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.СледующийПоЗначениюПоля("ЛС") Цикл
//Если начало периода не пустая дата
Если Выборка.НачалоПериода <>Дата(1,1,1) Тогда
Док = Документы.КУ_Претензия.СоздатьДокумент();
ДОК.Дата = ТекущаяДата();
Док.Собственник = Выборка.ОтветственныйСобственник;
//Чтобы период был равен периоду задолженности, а не весь период
Док.НачалоПериода = Мин(Выборка.НачалоПериода) ;
Док.КонецПериода = Макс(Выборка.КонецПериода );
//
Док.Организация = Организация;
ДОк.Ответственный = Справочники.Пользователи.НайтиПоНаименованию(имяПользователя());
ДОк.Состояние = СостояниеДОК;
Если Выборка.ДатаЗакрытия<>Дата(1, 1, 1) Тогда
Док.Комментарий = Строка("Закрытые лицевые счета!!!! от "+Выборка.ДатаЗакрытия);
КонецЕсли;//Выборка.ДатаЗакрытия<> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0) Тогда
Пока Выборка.Следующий() Цикл
Если Выборка.ПериодВзаиморасчетов <=Выборка.КонецПериода Тогда
строкаТч = Док.Задолженность.Добавить();
СтрокаТЧ.ЛицевойСчет = Выборка.ЛС;
строкаТч.помещение = Выборка.Помещение;
СтрокаТЧ.ВидУслуги = Выборка.ВидУслуги;
СтрокаТЧ.ПериодВзаиморасчетов=Выборка.ПериодВзаиморасчетов;
СтрокаТЧ.СуммаВсего = Выборка.СуммаВсего;
СтрокаТЧ.СуммаДолга = Выборка.СуммаДолга;
СтрокаТЧ.СуммаПени = Выборка.СуммаПени;
//Док.Записать();
КонецЕсли; // Выборка.ПериодВзаиморасчетов >=Выборка.НачалоПериода Тогда
КонецЦикла; //Выборка.Следующий() Цикл
Док.Записать();
КонецЕсли; //Выборка.НачалоПериода <>Дата(1,1,1,) Тогда
КонецЦикла; //Пока Выборка.Следующий() Цикл
Показатьspacecraft, вот кусок моего рабочего кода.
Я вначале делаю запрос, проверяю, есть ли нужные данные и далее по выбранным данным создаю новые документы, далее заполняя табличную часть.
Это всё в цикле.
Подскажите пожалуйста, это верное и оптимальное решение или у Вас есть предложения, как улучшить??
Дополню ещё.
Если ещё и другой документ, который создаётся на основании первого документа.
С такими же полями и с такой же самое табличной частью.
И как можно в 1 запросе и цикле, в зависимости от условий создать и заполнить 2 документа.
Как можно сделать этот цикл
(19)
1. Вы в каждой строке проверяете, что Начало периода не пустая дата, это условие можно перенести в запрос, чтобы он возвращал только нужные данные.
2. Вы ищите пользователя в цикле, его можно искать перед циклом, 1 раз, а потом просто присваивать.
3. Я бы в запрос добавил итоги по ЛС, чтобы делать обход результата запроса с группировкой, имхо, это более читаемо.
1. Вы в каждой строке проверяете, что Начало периода не пустая дата, это условие можно перенести в запрос, чтобы он возвращал только нужные данные.
2. Вы ищите пользователя в цикле, его можно искать перед циклом, 1 раз, а потом просто присваивать.
3. Я бы в запрос добавил итоги по ЛС, чтобы делать обход результата запроса с группировкой, имхо, это более читаемо.
(24)
Изменить текст запроса - добавить секцию ИТОГИ, изменить обработку результата запроса.
Например:
А вот по итогам по ЛС и обход по результатам группировок- не совсем понятно для чего это нужно.
Изменить текст запроса - добавить секцию ИТОГИ, изменить обработку результата запроса.
Например:
//{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЛицевыеСчета.Ссылка КАК ЛицевойСчет,
| ЛицевыеСчетаДополнительныеРеквизиты.НомерСтроки КАК НомерСтроки,
| ЛицевыеСчетаДополнительныеРеквизиты.Свойство КАК Свойство,
| ЛицевыеСчетаДополнительныеРеквизиты.Значение КАК Значение,
| ЛицевыеСчетаДополнительныеРеквизиты.ТекстоваяСтрока КАК ТекстоваяСтрока
|ИЗ
| Справочник.ЛицевыеСчета КАК ЛицевыеСчета
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ЛицевыеСчета.ДополнительныеРеквизиты КАК ЛицевыеСчетаДополнительныеРеквизиты
| ПО (ЛицевыеСчетаДополнительныеРеквизиты.Ссылка = ЛицевыеСчета.Ссылка)
|ИТОГИ ПО
| ЛицевойСчет";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаСсылка = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаСсылка.Следующий() Цикл
// тут в каждой строке выборки будет свой лицевой счет, остальные поля выборки в большинстве случаев будут не заполнены
// количество строк в выборке = количеству лицевых счетов
ВыборкаДетальныеЗаписи = ВыборкаСсылка.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
//тут будут детальные строки по текущему лицевому счету, который в ВыборкаСсылка.Лицевой счет
КонецЦикла;
КонецЦикла;
//}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
Показать
(30)При использовании итогов в запросе, в запрос можно добавить Минимум и Максимум для полей НачалоПериода и ОкончаниеПериода - и в них будет как раз минимальное и максимальное значение полей по каждому лицевому счету.
И в выборке по лицевым счетам эти поля будут заполнены.
ИТОГИ
МАКСИМУМ(КонецПериода),
МИНИМУМ(НачалоПериода)
ПО
ЛицевойСчет
И в выборке по лицевым счетам эти поля будут заполнены.
(32)
Вот кстати тоже момент, где я пока что не нашла хорошего решения, я по этому поводу спрашивала как-то на форуме..
начало периода- это такое поле, которое получается из условий.
1. если не было док. претензия, то тогда с начала задолженности.
2 если есть док. претензия, то тогда начало периода = последний документ Претензия.КонецПериода + 1 день.
Пользователи вручную создают и заполняют документы претензия и исковое заявление.
Я сделала этот код ради интереса, но им всё равно никто не пользуется.
Вот кстати тоже момент, где я пока что не нашла хорошего решения, я по этому поводу спрашивала как-то на форуме..
начало периода- это такое поле, которое получается из условий.
1. если не было док. претензия, то тогда с начала задолженности.
2 если есть док. претензия, то тогда начало периода = последний документ Претензия.КонецПериода + 1 день.
Если Объект.Задолженность.Количество()<>0 Тогда
Для каждого Стр Из Объект.Задолженность Цикл
//Чтобы период был равен периоду задолженности, а не весь период
Запрос.УстановитьПараметр("НачалоПериода", Стр.НачалоПериода);
//Ставим конец периода текущую дату потому, что ЛС мог оплатить
Запрос.УстановитьПараметр("КонецПериода", КонецДня(ТекущаяДата()));
КонецЦикла; //Для каждого Стр Из ТаблицаДолг Цикл
КонецЕсли; //Объект.Задолженность.Количество()<>0 Тогда
Пользователи вручную создают и заполняют документы претензия и исковое заявление.
Я сделала этот код ради интереса, но им всё равно никто не пользуется.
(19) тут цикл правомерен, так как по другому и не получится. Мы не говорили, что сам факт наличия цикла это плохо.
Вот этот код совсем не понятно, зачем в нем функции Мин и Макс? Они ничего не делают.
Далее, заполнение табличной части можно упростить, если в запросе получать представления имен полей такое же как в ТЧ.
Тогда можно использовать так:
Это то сразу бросилось в глаза.
//Чтобы период был равен периоду задолженности, а не весь период
Док.НачалоПериода = Мин(Выборка.НачалоПериода) ;
Док.КонецПериода = Макс(Выборка.КонецПериода );
Док.НачалоПериода = Мин(Выборка.НачалоПериода) ;
Док.КонецПериода = Макс(Выборка.КонецПериода );
Вот этот код совсем не понятно, зачем в нем функции Мин и Макс? Они ничего не делают.
Далее, заполнение табличной части можно упростить, если в запросе получать представления имен полей такое же как в ТЧ.
Тогда можно использовать так:
Пока Выборка.Следующий() Цикл
Если Выборка.ПериодВзаиморасчетов <=Выборка.КонецПериода Тогда
строкаТч = Док.Задолженность.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаТЧ, Выборка);
КонецЕсли; // Выборка.ПериодВзаиморасчетов >=Выборка.НачалоПериода Тогда
КонецЦикла; //Выборка.Следующий() Цикл
Это то сразу бросилось в глаза.
(22)
Благодарю Вас за пояснение, поняла.
Вот этот код совсем не понятно, зачем в нем функции Мин и Макс? Они ничего не делают.
Далее, заполнение табличной части можно упростить, если в запросе получать представления имен полей такое же как в ТЧ.
Тогда можно использовать так:
Пока Выборка.Следующий() Цикл
Если Выборка.ПериодВзаиморасчетов =Выборка.НачалоПериода Тогда
КонецЦикла; //Выборка.Следующий() Цикл
Далее, заполнение табличной части можно упростить, если в запросе получать представления имен полей такое же как в ТЧ.
Тогда можно использовать так:
Пока Выборка.Следующий() Цикл
Если Выборка.ПериодВзаиморасчетов =Выборка.НачалоПериода Тогда
КонецЦикла; //Выборка.Следующий() Цикл
Благодарю Вас за пояснение, поняла.
(19) 1.
вынесити за цикл, потому что получается запрос в цикле
2.
замените на
Справочники.Пользователи.НайтиПоНаименованию(имяПользователя())
вынесити за цикл, потому что получается запрос в цикле
2.
Если Выборка.ПериодВзаиморасчетов <=Выборка.КонецПериода Тогда
строкаТч = Док.Задолженность.Добавить();
СтрокаТЧ.ЛицевойСчет = Выборка.ЛС;
строкаТч.помещение = Выборка.Помещение;
СтрокаТЧ.ВидУслуги = Выборка.ВидУслуги;
СтрокаТЧ.ПериодВзаиморасчетов=Выборка.ПериодВзаиморасчетов;
СтрокаТЧ.СуммаВсего = Выборка.СуммаВсего;
СтрокаТЧ.СуммаДолга = Выборка.СуммаДолга;
СтрокаТЧ.СуммаПени = Выборка.СуммаПени;
//Док.Записать();
КонецЕсли;
Показатьзамените на
Если Выборка.ПериодВзаиморасчетов <=Выборка.КонецПериода Тогда
ЗаполнитьЗначенияСвойств(Док.Задолженность.Добавить(), Выборка);
КонецЕсли;
(18)
А как быть в таком случае.
Есть к примеру в выборке из запроса 100 различных строк, где есть сумма. Необходимо для каждой суммы сделать сумму прописью (обращение к функции числоПрописью)
Делаю так:
Т.е получается, что каждый раз в цикле идёт обращение к функции.
А как быть в таком случае.
Есть к примеру в выборке из запроса 100 различных строк, где есть сумма. Необходимо для каждой суммы сделать сумму прописью (обращение к функции числоПрописью)
Делаю так:
Пока выборка.следующий () цикл
суммаПрописью = числоПрописью(выборка.сумма);
КонецЦикла;
Т.е получается, что каждый раз в цикле идёт обращение к функции.
(50) именно в таком виде код бессмыслен. суммаПрописью тупо перезаписывается )
Но если о самой технике получения числа прописью в цикле для каждой строки выборки, то это нормально. По другому не сделать.
Тут не идет получение данных из базы данных в цикле и не вызов сервера с клиента в цикле. Именно об этом и речь. Сам по себе цикл это нормально. Просто нужно понимать, когда его не желательно использовать.
Но если о самой технике получения числа прописью в цикле для каждой строки выборки, то это нормально. По другому не сделать.
Тут не идет получение данных из базы данных в цикле и не вызов сервера с клиента в цикле. Именно об этом и речь. Сам по себе цикл это нормально. Просто нужно понимать, когда его не желательно использовать.
(50) Поддержу (51) и добавлю:
1. Плохо - выполнение запросов цикле (обращение к БД, нагрузка SQL). Или обращение к функциям и процедурам, которые используют обращение к БД.
2. Нормально - работа с циклами в оперативной памяти - один раз запросом получили данные из БД, они загрузились в оперативную память (выборка находится в ОЗУ), и тут их уже можно и нужно вертеть циклами (но с умом!).
И да, ваш код не имеет смысла.
1. Плохо - выполнение запросов цикле (обращение к БД, нагрузка SQL). Или обращение к функциям и процедурам, которые используют обращение к БД.
2. Нормально - работа с циклами в оперативной памяти - один раз запросом получили данные из БД, они загрузились в оперативную память (выборка находится в ОЗУ), и тут их уже можно и нужно вертеть циклами (но с умом!).
И да, ваш код не имеет смысла.
(54) Да (но при условии либо смены области, либо её вывода в результат:
PS. Попытайтесь писать операторы с Большой Буквы. УНасТакПринято. ЭтоУважениеККоллегам.
ОбластьПечати = Макет.ПолучитьОбласть(ИмяОбласти);
Пока Выборка.Следующий () Цикл
ОбластьПечати.Параметры.СуммаПрописью = ЧислоПрописью(Выборка.Сумма);
ТабДок.Вывести(ОбластьПечати);
КонецЦикла;
PS. Попытайтесь писать операторы с Большой Буквы. УНасТакПринято. ЭтоУважениеККоллегам.
(54) нет смысла создавать промежуточную переменную, если можно без нее и она больше не используется далее.
Заполнение параметров так же надежнее заполнять заполнением свойств. В запросе или макете даете сопоставимые имена и все параметры сразу заполняете по выборке. Так не будет ошибки времени выполнения. Максимум это данные не подставятся, но ошибка не выскочит.
Заполнение параметров так же надежнее заполнять заполнением свойств. В запросе или макете даете сопоставимые имена и все параметры сразу заполняете по выборке. Так не будет ошибки времени выполнения. Максимум это данные не подставятся, но ошибка не выскочит.
(61) 1. ТЗ.Колонки.Добавить("СуммаПрописью", Новый ОписаниеТипов("Строка"));
2. Никак. Здесь только перебор строк ТЗ или Выборки. Потому что в качестве параметра функции выступает конкретное число, которое вы сможете взять только из конкретной строки. Читаем СП.
2. Никак. Здесь только перебор строк ТЗ или Выборки. Потому что в качестве параметра функции выступает конкретное число, которое вы сможете взять только из конкретной строки. Читаем СП.
(62)
Подскажите пожалуйста, а как добавить колонки в ТЗ на форме (не является реквизитом обработки, данные заполняются из результатов запросов).
Пробую так
в таком случае ругается.
Я в запрос добавила пустую колонку.
В цикле по строкам ТЗ я редактирую эту колонку, таким образом работает.
Подскажите пожалуйста, а как добавить колонки в ТЗ на форме (не является реквизитом обработки, данные заполняются из результатов запросов).
Пробую так
ТЗ.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число"));
в таком случае ругается.
Я в запрос добавила пустую колонку.
|0 КАК МоёЧисло,
В цикле по строкам ТЗ я редактирую эту колонку, таким образом работает.
(56)
Вы мне сегодня про заполнение ТЧ документа также подсказали.
В печатной форме я это уже раньше реализовала, а вот про заполнение ТЧ документа не знала.
Просто привела пример кода, где идёт получение ЧислоПрописью
P.s.
Спасибо Вам огромное за пояснения. Реально, перечитывая сообщения или когда необходима помощь, то именно такие подробные сообщения и помогают понять.
Вы мне сегодня про заполнение ТЧ документа также подсказали.
В печатной форме я это уже раньше реализовала, а вот про заполнение ТЧ документа не знала.
Просто привела пример кода, где идёт получение ЧислоПрописью
P.s.
Спасибо Вам огромное за пояснения. Реально, перечитывая сообщения или когда необходима помощь, то именно такие подробные сообщения и помогают понять.
(60) вот так можно было бы сделать, если данные из выборки нужно обрабатывать дополнительно. Параметров области может быть несколько. Указываем их при создании структуры.
Если постобработка данных из выборки не нужна, то можно обойтись без структуры и заполняем параметры сразу из выборки.
Пока выборка.следующий () цикл
ПараметрыОбласти = Новый Структура("Парам1,Парам2,СуммаПрописью");
ЗаполнитьЗначенияСвойств(ПараметрыОбласти, Выборка);
ПараметрыОбласти["СуммаПрописью"] = числоПрописью(выборка.сумма);
ОбластьПечати.Параметры.Заполнить(ПараметрыОбласти);
ТабДок.Вывести(ОбластьПечати);
КонецЦикла;
ПоказатьЕсли постобработка данных из выборки не нужна, то можно обойтись без структуры и заполняем параметры сразу из выборки.
Забей. Оптимальный код - это гемор. Да и не нужен они никому толком.
Пример: можно загрузить список недействительных паспортов в базу 1С за 10 часов. Можно просто записать недействительные паспорта в 5000 файлов за 40 минут. Можно хитро загрузить их в 1С за 10 минут, но не в таблицу. От первого решения до третьего в части оптимизации прошло четыре года. Стоило? Может быть...
Забей.
Пример: можно загрузить список недействительных паспортов в базу 1С за 10 часов. Можно просто записать недействительные паспорта в 5000 файлов за 40 минут. Можно хитро загрузить их в 1С за 10 минут, но не в таблицу. От первого решения до третьего в части оптимизации прошло четыре года. Стоило? Может быть...
Забей.
(44)У меня нет задачи загрузки недействительных паспортов.
Поэтому и в доступе к сервису смысла нет.
Это был интерес о загрузке большого количества данных в базу, т.к. это довольно распространенная задача.
Если вы ничего по теме рассказать не можете, ок. Нет, так нет.
Поэтому и в доступе к сервису смысла нет.
Это был интерес о загрузке большого количества данных в базу, т.к. это довольно распространенная задача.
Если вы ничего по теме рассказать не можете, ок. Нет, так нет.
(46) в жанном случае грузить это в базу долго, дорого и раьотает потом медленно.
А по поводу загрузки в базу, то если архитектура хотя бы третьей нормальной форме соответствует, то со скоростью можно работать.
1С грузит так долго потому, что у нее проблемы с апдейтами - она сначала удаляет, потом вставляет, а вставка - это новые данные, удаленные данные скульный сервак бережно хранит. Поэтому без типа нарушения типа лицензионного соглашения нельзя что-то быстро загрузить в 1С.
Все задачи решаются очень большим количествлм методов, и большинство методов - правильные.
А по поводу загрузки в базу, то если архитектура хотя бы третьей нормальной форме соответствует, то со скоростью можно работать.
1С грузит так долго потому, что у нее проблемы с апдейтами - она сначала удаляет, потом вставляет, а вставка - это новые данные, удаленные данные скульный сервак бережно хранит. Поэтому без типа нарушения типа лицензионного соглашения нельзя что-то быстро загрузить в 1С.
Все задачи решаются очень большим количествлм методов, и большинство методов - правильные.
Недавно оптимизировал такой код:
А еще жалобы были - что иногда ошибка вываливается на строке с Выборка = Результат.Выбрать();
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваровУслуг.Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
| ГДЕ
| РеализацияТоваровУслуг.Проведен
| РеализацияТоваровУслуг.Дата МЕЖДУ ДатаС И ДатаПо";
Запрос.УстановитьПараметр("ДатаС", ТекущаяДата()-3*86400);
Запрос.УстановитьПараметр("ДатаПо", ТекущаяДата());
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
ТЗ_ИНН = Новый ТаблицаЗначений;
ТЗ_ИНН.Колонки.Добавить("ИНН");
Пока Выборка.Следующий() Цикл
НовСтр = ТЗ.Добавить();
НовСтр.ИНН = Выборка.Ссылка.Организация.ИНН;
КонецЦикла;
ТЗ_ИНН.Свернуть("ИНН");
ПоказатьА еще жалобы были - что иногда ошибка вываливается на строке с Выборка = Результат.Выбрать();
Доброго утра.
Я хочу продолжить эту тему
у меня возник такой вопрос.
Я соединяю ТЗ с новым запросом.
Как указать НачалоПериода в этом условии так
ТЗ.НачалоПериода т.е. данные из строки ТЗ?
На данном этапе указано так
Я хочу продолжить эту тему
у меня возник такой вопрос.
Я соединяю ТЗ с новым запросом.
ТЗ = Объект.ТЗ.Выгрузить();
....................................................
|ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.КУ_Взаиморасчеты.ОстаткиИОбороты(, &КонецПериода, , , ) КАК КУ_ВзаиморасчетыОстатки
....................................................
|ГДЕ
|
| КУ_ВзаиморасчетыОстатки.ПериодВзаиморасчетов >= НАЧАЛОПЕРИОДА(ТаблицаДолг.НачалоПериода, ДЕНЬ)
....................................................
ПоказатьКак указать НачалоПериода в этом условии так
ТЗ.НачалоПериода т.е. данные из строки ТЗ?
На данном этапе указано так
//Если Объект.ТЗ.Количество()<>0 Тогда
// Для каждого Стр Из Объект.ТЗЦикл
// Запрос.УстановитьПараметр("НачалоПериода", Стр.НачалоПериода);
//КонецЦикла; //Для каждого Стр Из ТЗЦикл
//КонецЕсли; //Объект.ТЗ.Количество()<>0 Тогда
//
(68) все зависит от того, какие данные нужны для выборки.
Обычно для такого случая проще соединять с таблицей движения, чем использовать виртуальную таблицу (ОстаткиИОбороты).
Если нужны обороты, то можно так:
Соответственно еще указать соединение по другим полям...
Обычно для такого случая проще соединять с таблицей движения, чем использовать виртуальную таблицу (ОстаткиИОбороты).
Если нужны обороты, то можно так:
Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ
| ТЗ.НачалоПериода КАК НачалоПериода,
| ТЗ.Контрагент КАК Контрагент
|ПОМЕСТИТЬ ВТ_ТЗ
|ИЗ
| &ТЗ КАК ТЗ
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| ВТ_ТЗ.Контрагент КАК Контрагент,
| СУММА(ВЫБОР
| КОГДА Взаиморасчеты.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
| ТОГДА Взаиморасчеты.Сумма
| ИНАЧЕ -Взаиморасчеты.Сумма
| КОНЕЦ) КАК Сумма
|ИЗ
| ВТ_ТЗ КАК ВТ_ТЗ
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.КУ_Взаиморасчеты КАК Взаиморасчеты
| ПО (Взаиморасчеты.Контрагент = ВТ_ТЗ.Контрагент)
| И (Взаиморасчеты.Период >= ВТ_ТЗ.НачалоПериода)
| И (Взаиморасчеты.Период < &КонецПериода)
|
|СГРУППИРОВАТЬ ПО
| Взаиморасчеты.Контрагент
|";
Запрос.УстановитьПараметр("КонецПериода", КонецПериода);
Запрос.УстановитьПараметр("ТЗ", Объект.ТЗ.Выгрузить());
ПоказатьСоответственно еще указать соединение по другим полям...
Доброго вечера.
Подскажите пожалуйста, оптимален ли такой код.
1. Из ТЧ на форме я выгрузила некоторые колонки в ТЗСуммыПрописью , затем изменила из значения и добавила новые колонки.
2. При печати идёт обращение в цикле к этой функции.
Подскажите пожалуйста, оптимален ли такой код.
1. Из ТЧ на форме я выгрузила некоторые колонки в ТЗСуммыПрописью , затем изменила из значения и добавила новые колонки.
2. При печати идёт обращение в цикле к этой функции.
Функция ОбластьНиз(ИмяМакета,КодЛС) //Суммы прописью
ПарПредмета = "рубль,рубля,рублей,м,копейка,копейки,копеек,ж,2";
ФормСтрока = "Л = ru_RU; ДП = Истина";
//19.07.2020
Обработка = РеквизитФормыВЗначение("Объект");
Макет = Обработка.ПолучитьМакет(ИмяМакета);
ОбластьНиз = Макет.ПолучитьОбласть("Низ");
Если ТЗ.Количество()<> 0 Тогда
ТЗСуммыПрописью = СуммыПрописью ();
Для Каждого Строка ИЗ ТЗСуммыПрописью Цикл
Если Строка.КодЛС = КодЛС Тогда
ОбластьНиз.Параметры.Заполнить(Строка);
КонецЕсли; // Строка.КодЛС = КодЛС Тогда
КонецЦикла; //Для Каждого Строка ИЗ ТЗ Цикл
КонецЕсли; // ТЗ.Количество()<> 0 Тогда
Возврат ОбластьНиз;
КонецФункции //СуммыПрописью(ИмяМакета,СуммаДолгаПр,СуммаПениПр,ГоспошлинаПР,СуммаВсегоПр) //Суммы прописью
//Вызов функции
Процедура Печать()
Пока Выборка.Следующий() Цикл
ОбластьСуммаДолгаПрописью =
ОбластьСуммаДолга(ИмяМакета, Выборка.КодЛС);
КонецЦикла;
КонецПроцедуры
Показать
(73)
Вспомнила про такое решение
Вспомнила про такое решение
Если ТЗ.Количество()<> 0 Тогда
ТЗСуммыПрописью = СуммыПрописью ();
//Идём по строкам ТЗСуммыПрописью
Для Каждого СтрокаТЗ Из ТЗСуммыПрописью Цикл
СтрокаТЗ.КодЛС = КодЛС;
//Делаю отбор в ТЗ и иду только по текущему ЛС
//https://helpme1c.ru/tablica-znachenij-v-yazyke-1s-8-v-primerax
ОтборСумм = Новый Структура;
ОтборСумм.Вставить("КодЛС", КодЛС);
СтрокиСумм = ТЗСуммыПрописью.НайтиСтроки(ОтборСумм);
Для Каждого Строка Из СтрокиСумм Цикл
ОбластьНиз.Параметры.Заполнить(Строка);
КонецЦикла; //Для Каждого Строка ИЗ ТЗ Цикл
КонецЦикла; //Для Каждого Строка ИЗ ТЗ Цикл
КонецЕсли; // ТЗ.Количество()<> 0 Тогда
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот