Ускоряем 1С: модули с повторным использованием возвращаемых значений

Публикация № 668213

Разработка - Практика программирования

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

В чем проблема

Часто нам приходится по ходу исполнения программы получать значения, которые хранятся в базе данных и не меняются годами. Яркий пример - значения констант. Отчасти, можно причислить сюда же поиск элемента справочника или узла плана обмена по коду, получение значений реквизитов объектов по ссылке.

Не думая, "на лету" такие задачи решаются конструкциями вида:

Если ДатаДокумента > Константы.ДатаНачалаПримененияПостановления1137.Получить() Тогда

В результате, каждый раз когда выполняется этот код - происходит "дерганье" базы данных.

Программисты более щепетильно относящиеся к своему коду, выполняют один запрос к базе данных, кэшируя все данные которые им понадобятся, однако такой подход не всегда приводит к желаемой разгрузке БД:

  1. Цикл выполнения кода может быть неявным (например, групповое перепроведение документов)
  2. Получить строгий набор данных (не больше и не меньше), которые потребуются позже, иногда затруднительно или вовсе невозможно.
  3. Кэшированные значения требуется использовать в разных вызовах/формах

Модуль с повторным использованием возвращаемых значений

Для решения описанных проблем в платформе есть модули с повторным использованием возвращаемых значений. Фактически, это обычный общий модуль (клиентский или серверный), в котором Повторное использование возвращаемых значений установлено в "На время вызова" или "На время сеанса". В самом модуле процедуры и функции описываются как обычно.

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

Возвращаемые значения, естественно, кэшируются в разрезе значений переданных параметров, т.е. при выполнении кода

Узел1 = НашМодуль.ПолучитьУзелОбменаСБухгалтерией("0001");
Узел2 = НашМодуль.ПолучитьУзелОбменаСБухгалтерией("0002");

, оба вызова действительно приведут к выполнению соответствующей процедуры и вернут разные ссылки, а при последующих попытках получить узел с кодом 0001 или 0002 - будут возвращаться соответствующие узлы без вызова процедуры и, как следствие, базы данных.

Значения кэшируются отдельно для каждого сеанса на клиенте или сервере (в зависимости от того клиентский или серверный модуль). Т.е. если есть особенности настройки прав доступа или другой зависимости полученного значения от текущего пользователя - все отработает корректно.

Чего делать нельзя

Есть одно ограничение. В качестве параметров функций можно указывать только простые типы. Неопределено, Null, Булево, Дата, Строка, Число, Ссылка. Никаких структур, таблиц значений, объектов и т.п. Если вы попытаетесь передать в качестве параметра, например, структуру - все отработает, но о повторном использовании полученного значения можете забыть.

Возвращаемое значение при этом может быть любого типа.

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

Баг или фича от 1С

Интересное свойство есть у повторно используемых значений. Баг это или фича непонятно, но знать о нем не помешет. Если выполнить код следующего характера:

ЗначениеСтруктура1 = НашМодуль.ПолучитьСтруктуруЗначенийРеквизитов(СсылкаНаОбъект);

ЗначениеСтруктура1.Наименование = "Новое наименование";

ЗначениеСтруктура2 = НашМодуль.ПолучитьСтруктуруЗначенийРеквизитов(СсылкаНаОбъект);

, то в ЗначениеСтруктура2.Наименование будет лежать именно "Новое наименование". В принципе, это можно использовать для обновления значений, реально измененных в БД, но когда прикроют и прикроют ли лавочку - непонятно. При разработке типовых решений так делать запрещено.

Что делать при изменении закэшированных данных

Есть всего лишь один "легитимный" метод обработать ситуацию с изменением закэшированного значения в базе данных. Это метод ОбновитьПовторноИспользуемыеЗначения(). Будут сброшены значения всех функций по всем параметрам всех модулей. Обновить по конкретным значениям параметров / функциям / модулям нельзя.

Соответственно, из-за такого волюнтаристского подхода, пользоваться этой функцией необходимо крайне осмотрительно: вся система после его использования какое-то время будет работать существенно медленнее.

Посягаем на святое: пишем запрос в цикле

Кроме очевидных вариантов использования функций с повторным использованием возвращаемых значений, есть немало интересных, универсальных, нестандартных подходов, среди которых:

  • Написание универсальных процедур, возвращающих реквизиты произвольных ссылок (есть в БСП)
  • Написание процедур, возвращающих значения констант по имени константы (есть в большинстве типовых)
  • Возврат "чуть большего" объема данных, чем необходимо ради уменьшения количества вызовов (напр. если требуется получить курсы сразу нескольких валют, имеет смысл вызывать функцию по дате без отбора валюты, получить курсы всех валют и далее "разбираться на месте" какая из валют в настоящий момент нужна)
  • Написание процедуры, выполняющей запрос с кэшированием результата (входящими параметрами при этом будут текст запроса и пара-тройка имен и значений параметров)

Но есть еще один подход, на котором я хочу остановиться подробно. Это использование функции, содержащей вызов БД, с повторным использованием возвращаемого значения в цикле. Т.е. фактически это запрос в цикле. Вообще, нас учили так не делать, но бывают случаи, когда такое построение кода приведет к лучшей производительности, если:

  1. Количество различных значений входящих параметров, которые встретятся внутри цикла небольшое и подавляющее большинство сочетаний с высокой долей вероятности было получено ранее в этом сеансе.
  2. Заранее получить строгий набор сочетаний значений входящих параметров, которые встретятся в цикле затруднительно, а получение значений для всех возможных сочетаний значений входящих параметров приведет к считыванию большого объема данных из БД

Как видите формулировки не точные и больше похожи на напутствия, чем на правила. Поэтому всегда держите в голове контекст, оценивайте текущую картину, обдумывайте условия в которых будет работать ваш код.

136

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. panvartan 04.09.17 17:26 Сейчас в теме
Используем утечки памяти по назначению
2. kolya_tlt 11 04.09.17 17:55 Сейчас в теме
Имеет смысл кэшировать данные, полученные из базы данных, внешних источников данных или путем сложных (ресурсоемких) вычислений. Причем в ряде случаев, даже значения, полученные из базы данных, не стоит кэшировать, если выгода от их кэширования – неочевидна.

https://its.1c.ru/db/v8std#content:-2145782923:hdoc
Winstoncuk; eeeio; dabu-dabu; +3 Ответить
3. Dream_kz 93 04.09.17 18:41 Сейчас в теме
Баг это или фича непонятно, но знать о нем не помешет


Просто особенность, первым вызовом получим ссылку на элемент в области памяти, поменяем ее значение, а вторым вызовом получим ссылку на эту же область памяти, естественно что значение по ссылке уже будет измененное.

Статья хорошая, но не раскрыты собственно сами модули, отличия при хранении на время вызова и на время сеанса, время хранения значений на сервере на время сеанса (около 6 минут), а так же то, что это не панацея, и допустим от получения булевых констант таким образом, выигрыша будет мало.
user1188623; for_sale; Winstoncuk; formica32; raider-rec@ya.ru; zuxelzz; frkbvfnjh; pbabincev; nvv1970; Artem-B; mytg; Yashazz; vovan_victory; JohnyDeath; Sergant666; DimaP; ivant; alexch8; +18 Ответить
5. headMade 140 04.09.17 20:39 Сейчас в теме
(3)в чем будет принципиальное отличие при чтении и кешировании значений булевых констант?
6. nicxxx 235 04.09.17 21:26 Сейчас в теме
(5)Очевидно же, что чтение будет обращаться к таблице констант в базе, а использование кэша заменяет обращение к базе обращением к памяти, что несколько быстрее, раз в 100 примерно.
9. chea06 131 05.09.17 09:56 Сейчас в теме
(6)не факт
"Причем в ряде случаев, даже значения, полученные из базы данных, не стоит кэшировать, если выгода от их кэширования – неочевидна. Например, не стоит кэшировать константы (объект метаданных) примитивных типов, поскольку часто они привносят лишь незначительную долю от общего времени выполнения ресурсоемкой операции" ©
61. triviumfan 10 08.02.19 10:57 Сейчас в теме
(9) Почему тогда в БСП такие константы кешируются?
10. Dream_kz 93 05.09.17 10:49 Сейчас в теме
(5) Принципиальных отличий не будет, но как сказал я ранее, и дали ссылку в (9) эффекта будет мало.
44. nvv1970 11.11.17 09:55 Сейчас в теме
(3) Звезда не заработана.
Время жизни кэшированных значений - это важнейший момент, отличающий данный механизм от глобальной переменной используемой как КЭШ.
На ИТС кажется были следующие значения: 20 минут от создания или 6 минут от последнего чтения из кэша.
...кэш не хранит данные вечно. Закэшированное значение будет удалено из кэша через 20 минут после вычисления или через 6 минут после последнего использования (в зависимости от того, что наступит раньше*). Кроме этого значение будет удалено при нехватке оперативной памяти в рабочем процессе сервера, при перезапуске рабочего процесса и при переключении клиента на другой рабочий процесс. Поэтому если никто "не успел" воспользоваться данными из кэша, то этот ресурс был потрачен зря.


А самый большой косяк автора - это не рассказать где живут кэши! И что будет при использовании "фичи".
Чтобы не быть голословным - еще раз перепроверил свои знания практическим примером. Докладываю:
Повторяемый серверный модуль с вызовом сервера имеет 2 кэша: как на сервере, так и на клиенте!!! Если самому "установить" в закэшированную структуру значение, то оно запишется в кэш только там где его присвоили (на клиенте или на сервере). Т.о. на клиенте и на сервере после такой махинации будем из кэша получать разные значения.
kuzyara; unichkin; marku; Arc; SkyJack; eeeio; zuxelzz; dabu-dabu; user747571; pbabincev; ZOMI; Deslime; Daynestro07; pvlunegov; sashocq; mxs89; Serj1C; +17 Ответить
4. vandalsvq 1129 04.09.17 18:57 Сейчас в теме
Это не баг, скорее все таки фича. На прошлой партнерке 1С рассказывали, объекты возвращаются по ссылке, т.е. не копия структуры, массива и т.д., а ссылка на область памяти по сути (косвенно можно сделать такие выводы также из статьи про системы диагностики из "зазеркалья" тынц).

Так что, не рекомендуют так обновлять - что ж поделать, не будем. Ну если только совсем чуть-чуть, ну самую капелюшечку )))))
39. caponid 10.11.17 15:23 Сейчас в теме
(4) Это не баг, и таки не фича - это способ выстрелить себе в ногу))).

Если хочется возвращать наборы значений - то логичней использовать "фиксированные" - Фиксированная структура и т.д.
rudnitskij; madonov; +2 Ответить
7. Dnki 4 05.09.17 07:49 Сейчас в теме
Про механизм знаю, но пользуюсь.
* Первая причина: неудобно 1С сделала признак - на весть модуль. Нужно было бы сделать директиву к функции, аналогично "export". По-моему, сам бог велел ввести такое свойство, явно написанное программистом, а не легко устанавливаемая/ снимаемая птичка. Я поясню: написал я модуль "РаботаСЧемТО". В нем собраны ф-ии по одной теме. Из них только одна нужна с кэшированием. Ясно дело, можно разбить, но краше от этого программа не будет.

* Механизм очень уж неявный. Я не знаю, когда сбросится кэш. Самому дать команду сброса - сбрасывается все. Короче, все что не написано программистом, вызывает сомнение в работе, особенно в след. релизах. Когда мне понадобилось, я сам написал. Например, кэш курсов валют сбрасываю в начале формирования отчета. Некоторые данные, часто используемые, но практически не меняемые, читаются в глобальный объект только при запуске.

* В задаче повторных значений лучше бы 1С решило для меня такую задачу: по анлогии с "С" иметь параметр объявления переменных Static. Такие переменные, являясь переменными процедуры, сохраняются в памяти между вызовами процедуры.Вот это был бы классный кэш!
maXon777; eeeio; Gureev; TanyTany; baton_pk; sergelemon; Yashazz; mixsture; shard; PowerBoy; c1nil; +11 Ответить
20. mefalcon 20 06.09.17 10:04 Сейчас в теме
(7)>>Я поясню: написал я модуль "РаботаСЧемТО". В нем собраны ф-ии по одной теме. Из них только одна нужна с кэшированием. Ясно дело, можно разбить, но краше от этого программа >>не будет.

Именно так 1С делает в типовых решениях, добавляя в конец имени модуля, отражающую предметную область использования, суффикс "ПовтИсп"
https://stimul.kiev.ua/materialy.htm?a=pravila_sozdaniya_obshchikh_moduley
21. herfis 283 06.09.17 10:35 Сейчас в теме
(20) Более того - это зафиксировано в стайл-гайде 1С по именованию общих модулей.
В принципе - не такое это уж и неудобство. Ну, то что нужно отдельный модуль для этого. Даже в чем-то лучше, чем на уровне сигнатуры функции это указывать, как в (7) предлагали. Да, модуля плодятся, но в клиент-сервере их и так плодить приходится. А лучше тем, что прямо по вызову функции видно, что она кэшируемая. В клиент-сервере если боль-менее развесистую подсистему делаешь, то начинается
Клиент, КлиентСервер, Сервер, ВызовСервера, КлиентПовтИсп, СерверПовтИсп - шесть модулей как с куста.
А могут еще быть ПолныеПрава и Глобальный (но за глобальные надо расстреливать, я считаю).
8. starik-2005 1960 05.09.17 09:47 Сейчас в теме
"Есть многое на свете, друг Горацио, что и не снилось нашим мудрецам" (с) Шекспир.

К чему это я? А к тому, что иногда (и даже часто) некоторые моменты при кешировании объектов таким способом могу привести к непредсказуемым последствиям. В частности, от длины "ключа" может зависеть жизнеспособность кешированного объекта при последующем его обновлении. Т.е. типа получаете объект тОбъект = ОбщМодПовтИсп.ПолучитьОбъект("ХХХУУУZZZ"), а он вам так раз....
11. herfis 283 05.09.17 10:57 Сейчас в теме
Хоть и РТФМ, но плюсанул. Может, кому-то статья поможет начать использовать эту функциональность.
Сам использую достаточно широко - в ряде случаев помогает одновременно и упростить код и повысить его эффективность.
Единственный совет - хорошо подумайте, точно ли кэшируемая информация является условно-постоянной (является ли критичным доступ к обновленным в течение сеанса данным).
12. Anton64 246 05.09.17 13:18 Сейчас в теме
Ссылку нельзя передавать параметром?
13. herfis 283 05.09.17 13:29 Сейчас в теме
14. tormozit 5594 05.09.17 13:32 Сейчас в теме
Неплохо бы еще не только про "на время сеанса" но и про 20 минутное время жизни значений в кэше упомянуть. Эта особенность на некоторые способы использования влияет сильно.
16. herfis 283 05.09.17 14:07 Сейчас в теме
(14) Кэш, как и обещано, живет до конца сеанса. Через 20 минут без использования он просто на диск откочует. И "неожиданности" тут возникнут только с мутабельными значениями, которые невозможно корректно сериализовать. То есть проблемы возникнут, если пытаться использовать кэш как хранилище глобальных серверных переменных произвольного типа. Но да - эту особенность упомянуть стоит однозначно.
Можно, например, инициализированный COM-объект так держать в памяти сервера. В большинстве случаев ничего страшного, если он пересоздастся после долгого неиспользования. Я по-дефолту так с сервера всякие сторонние соединения поднимаю. Если же пытаться так хранить мутабельные промежуточные результаты, которые терять нельзя, то придется обеспечить их "дергание", чтобы они не потерялись при попытке сериализации. Но это уже совсем изощренные костыли, которых стоит избегать. Лучше оставаться в рамках stateless-модели сервера, пусть и с некоторой потерей эффективности.
TanyTany; +1 Ответить
17. tormozit 5594 05.09.17 15:11 Сейчас в теме
(16)
Кэш, как и обещано, живет до конца сеанса.

Ошибаешься. Тут уже привели ссылку на ИТС. Почитай https://its.1c.ru/db/v8std#content:-2145782923:hdoc
pbabincev; +1 Ответить
18. herfis 283 05.09.17 15:27 Сейчас в теме
(17) Смущает примечание "раздел обновлен". Сдается мне, ранее на ИТС я читал совсем другое.
19. herfis 283 05.09.17 15:35 Сейчас в теме
(17) Хотя и в руководстве разработчика на ИТС тоже самое написано...
Не хотелось бы принимать во внимание свой маразм, но видимо придется :)
35. nvv1970 07.09.17 22:02 Сейчас в теме
(17) Перечитал это еще раз (процитирую)
Закэшированное значение будет удалено из кэша через 20 минут после вычисления или через 6 минут после последнего использования (в зависимости от того, что наступит раньше*). Кроме этого значение будет удалено при нехватке оперативной памяти в рабочем процессе сервера, при перезапуске рабочего процесса и при переключении клиента на другой рабочий процесс. Поэтому если никто "не успел" воспользоваться данными из кэша, то этот ресурс был потрачен зря.
* Примечание: конкретные цифры могут варьироваться в зависимости от используемой версии платформы 1С:Предприятие.

На какой-то из недавних версий платформы пытался это поведение протестировать. Ставишь точку в повторяемом модуле. Провалился в модуль - кэш очистился, нет - еще жив.
Любопытно, что четких временных границ для "последнего использования" не оказалось. Как-то хаотично очистка кэша срабатывала: могло и по 10, и по 20 минут не очищаться при полном бездействии. Но то что очистка происходит - это факт. И это прекрасно )) С содроганием вспоминаю кэш в глобальной переменной.

ПС: еще не раскрыта тема и приведены примеры "кэша на вызов". Такой вид почти не используется. А между тем тоже стоит о нем помнить. Хватает специфических сложных алгоритмов, когда такой кэш незаменим.
15. xReason 05.09.17 13:39 Сейчас в теме
Можно возвращать данные с типом ФиксированнаяСтруктура, ФиксированныйМассив и т.д.
Тогда фича от 1С в виде изменяемого значения не будет работать
32. Darklight 19 07.09.17 09:23 Сейчас в теме
(15)Возвращать-то можно любое значение. Но, принимать как параметр.... в повторно используемую функцию можно значение типа "Структура". Но НЕЛЬЗЯ типа "ФиксированнаяСтруктура" - вот такой идиотизм. Конечно преобразования "Структура" <-> "ФиксированнаяСтруктура" делается легко - но для повторного использования важна идентичность входных параметров - а тут она теряется!
Поэтому, лично я предпочитаю вот так (привожу в упрощённом виде) создавать структуры - когда нужна их идентичность (ну и не изменять их потом):

//Размещено в модуле повторного использования
функция Структура(ПараметрыСтр, п1=null,п2=null,...здесь ещё 96 таких параметра...,п99=null,п100=null)
    возврат Новый Структура( ПараметрыСтр, п1,п2,...здесь ещё 96 таких параметра...,п99,п100);
КонецФункции


Такой подход "гарантирует", что где-то 20 минут структура будет идентична, и её "без опаски" можно дальше передавать как входной параметры в другие повторно используемые функции.
Конечно, есть и другие варианты достичь идентичности.
22. bruho 06.09.17 15:02 Сейчас в теме
Для того, чтоб "сбросить" значения в методе с повторным использованием использую необязательный параметр, в который передаю УИ. Но подходит только для тех случаев, когда явно указываешь вызов с заполненным необязательным параметром.

Функция МетодСПовторнымИспользованием(ОбновитьЗначение = Неопределено) Экспорт 
	
	Время = ТекущаяДата();
	
	Возврат Время;
КонецФункции

//Время вернет из первого обращения к методу
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = Строка(МетодСПовторнымИспользованием());
Сообщение.Сообщить();


//Время вернет текущее
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = Строка(МетодСПовторнымИспользованием(Строка(новый УникальныйИдентификатор)));
Сообщение.Сообщить();



Показать
58. a.x 22.11.18 05:30 Сейчас в теме
(22) Лучше сделать два метода - первый в обычном модуле (без повторного использования), второй - в модуле с повторным использованием.

Модуль без повторного использования
Функция ПолучитьКешируемоеЗначение(Обновить = Ложь) Экспорт
    
    Кеш_ = МодульПовтИсп.ПолучитьКеш();
    
    Если Истина = Обновить Тогда
        Кеш_.Очистить();
    КонецЕсли;
    
    Если Не Кеш_.Свойство("Значение") Тогда
        // Инициализируем кешируемое значение.
        Кеш_.Вставить("Значение", 3.1415);
    КонецЕсли;
    
    Возврат Кеш_.Значение;
    
КонецФункции
Показать


Модуль с повторным использованием значений (МодульПовтИсп)
Функция ПолучитьКеш() Экспорт
    
    Кеш_ = Новый Структура;
    
    Возврат Кеш_;
    
КонецФункции
Показать
23. Rustig 1194 06.09.17 15:11 Сейчас в теме
(0) я суть статьи не понял. рабочие примеры есть для понимания?

уже писал на форуме, прошло не замеченным - то что сейчас разработчики типовых 1с применяют - сильно огорчает. вот пример:

Столкнулся в УТ 10.3 с такой проблемой - в УТ 10.3 появился механизм ПравилаВыборочнойРегистрацииОбъектов (константа),

который не позволяет переименовывать типовые реквизиты документов.

Я переименовал в документе ПКО реквизит Основание (Тип Строка), потому что он некорректно заполняется при заполнении на основании другого документа (стандартный параметр Основание процедуры ОбработкаЗаполнения()).

...Срабатывает процедура ОбработкаЗаполнения, в которую передается параметр Основание (тип ДокументСсылка). В конце концов реквизит документа Основание и параметр Основание пересекаются и дают отрицательный эффект.

Я переименовал этот реквизит в ОснованиеСтрока - теперь у меня элементарно не проводится документ, выходит ошибка здесь:

Функция ПолучитьТаблицуРеквизитовРегистрацииШапкиДоИзменения(Объект, СтрокаТаблицыРеквизитовРегистрации)

ТекстЗапроса = "
|ВЫБРАТЬ " + СтрокаТаблицыРеквизитовРегистрации.РеквизитыРегистрации
+ " ИЗ " + СтрокаТаблицыРеквизитовРегистрации.ИмяОбъекта + " КАК ТекущийОбъект
|ГДЕ
| ТекущийОбъект.Ссылка = &Ссылка
|";

Запрос = Новый Запрос;
Запрос.Текст = ТекстЗапроса;
Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка);

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

КонецФункции

, в запрос тащится СтрокаТаблицыРеквизитовРегистрации.РеквизитыРегистрации, который содержит следующие поля:

Организация, ВидОперации, Контрагент, ДоговорКонтрагента, ВалютаДокумента, СуммаДокумента, ПринятоОт, Основание, Приложение, Комментарий, ДокументОснование, СтатьяДвиженияДенежныхСредств, СтавкаНДС, НомерЧекаККМ, ПометкаУдаления, Проведен, Номер, Дата, Ответственный, ОтражатьВБухгалтерскомУчете

То есть таким механизмом разработчики ут 10.3 не позволяют переименовывать типовые реквизиты. Хм, думаю это неправильно.

может я не туда пишу - поправьте - но это своего рода кэширование - хранение информации о жесткой структуре метаданных конфигурации которую как будто теперь нельзя изменять - валятся родные механизмы
24. gmkushkunov 06.09.17 15:42 Сейчас в теме
(23) Здравствуйте.

По поводу жесткой структуры не совсем понятно, раз вы переименовали стандартный реквизит значит структура нежесткая, просто надо переписать код где идет обращение к этому реквизиту. Мне кажется Вы сами никогда не программировали в связке СУБД. Если Вы создали в СУБД таблицу а в ней поля, назвали их как то и написали программу, в которой идет обращение к этой таблице и ее полям (т.е. к их именам), протестировали и дали заказчику полностью рабочую программу, а заказчик в свою очередь переименовал стандартные поля в Вашей таблице не исправляя кода программы, где идет обращение к переименованным полям и обнаруживает, что программа перестала работать (выдает ошибки и т.д.) и начинает Вам жаловаться, что Вы не правильно составили программу, как Вы на это посмотрите?

P.S. на самом деле Вы не в ту тему пишите.
sergelemon; Rustig; +2 Ответить
25. Rustig 1194 06.09.17 16:40 Сейчас в теме
(24) я понял вас: пугает что этот список реквизитов засунули в константу с типом Хранилище.

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

в нашем случае Глобальный Поиск не нашел Константу в которой спрятан список реквизитов - по сути строка спрятана, саму константу в пользовательском режиме вы тоже не откроете и не увидите - потому тип объекта Хранилище.

ну и кто так кодит?

вердикт - что-то намудрили в УТ с механизмами версий, оттуда проблемы происходят
26. Rustig 1194 06.09.17 16:47 Сейчас в теме
(24) я вот не пойму обсуждаемую здесь тему с кэшированием без примеров - какую конкретную задачу пытается решить автор?
27. herfis 283 06.09.17 17:09 Сейчас в теме
(26) Автор не про конкретную задачу, а про инструмент.
Если хочется живых примеров - откройте список общих модулей любой современной типовой и глядите в модуля, где в конце "ПовтИсп" в названии.
sergelemon; Rustig; +2 Ответить
28. Rustig 1194 06.09.17 17:29 Сейчас в теме
(27) ок, понятно
а зачем так сложно придумали?
столько модулей развели - в чем суть?
29. herfis 283 07.09.17 07:03 Сейчас в теме
(28) Жертвы на алтарь возможности работать через браузер.
30. Rustig 1194 07.09.17 08:07 Сейчас в теме
(29) где-нибудь можно об этом прочитать подробнее?
50. mitia.mackarevich 27 15.03.18 01:47 Сейчас в теме
(23) Убрал бы из ПР "свой реквизит" и назвал бы его как переделал, ну или отключил галку использовать ВРО в обмене. Это не кэш, это механизм регистрации БСП, где грубо говоря регистрация = ПРО + ВРО
33. profiprog1c 184 07.09.17 12:49 Сейчас в теме
Статья полнейшая глупость. Если бы автор реально занимался замерами работы производительности, то он бы знал, что получение константы методом:
Константы.ЛюбаяКонстанта.Получить()
занимает тысячные доли процента, от времени выполнения реального кода.
А уж если и нужно в коде часто использовать данные этой константы, то пишем:
НашаПеременная = Константы.ЛюбаяКонстанта.Получить()
и дальше использ-уем НашаПеременная
Самые затраты операции при работе кода - это запросы и вот там нужно оптимизировать.
34. nvv1970 07.09.17 21:44 Сейчас в теме
(33) Это так, экономия на спичках, непонимание которой, умноженное на тысячи, сотни тысяч обращений к СУБД в сотнях или тысячах сеансов сделают свое черное дело. Конечно СУБД тоже не дура - сама что-то закэширует. Но, гуру подскажут точно, наверняка это генерирует лишние соединения к СУБД, количество которых в какой-то момент тоже может быть критичным.
Мораль такова: если нужно переходить дорогу на зеленый свет - давайте это делать всегда, даже если дорога пустая, а не только когда это кому-то нужно. Если есть инструмент, то, как минимум, им нужно хотя бы уметь пользоваться. А лучше пользоваться всегда и по назначению.
51. Rustig 1194 15.03.18 09:20 Сейчас в теме
(34) использую Допущения во всех задачах у клиентов: пример, цикл в цикле и т.д.
использую миллион допущений "здесь и сейчас" - потому что знаю бизнес клиента.
к примеру есть универсальный алгоритм проведения , в котором то там то здесь стоит проверка на валюту - а я знаю, что у клиента бизнес рублевый - удаляю все проверки, везде ставлю курс =1 и т.д.
ваш пример с зеленым светом - некорректный - вы мыслите узко, кто-то за вас придумал светофор, и вы считаете что так и должно быть - в случае со светофором лучший вариант это интеллектуальный светофор - кнопочный - подходит человек и нажимает кнопку - оповещает о своем намерении перейти дорогу....
короче,
1) иногда правильно использовать допущения , и не умножать на 1000 - потому что ваша тыща никогда не случится
2) иногда правильно не мыслить чужими навязанными шаблонами , а придумать так, чтобы комфортно тебе жилось (заодно и другим)
за Константу поддерживаю,,механизм в статье путанный , может и годный, но подача материала желает быть лучше
пытаться создать универсальное решение для разных бизнесов и масштабов - вот яма, в которую попадают разработчики
37. Hobbit_Jedi 10.11.17 00:10 Сейчас в теме
(33)
А уж если и нужно в коде часто использовать данные этой константы, то пишем:
НашаПеременная = Константы.ЛюбаяКонстанта.Получить()
и дальше использ-уем НашаПеременная


А если нужно что-то вроде следующего решения?

Процедура ОбработатьЧтоТо(Ссылка)
  Если Константы.ЛюбаяКонстанта.Получить() Тогда
    //...
  КонецЕсли;
КонецПроцедуры

Процедура ОбработатьВсе()
  Для Каждого Ссылка Из ОбрабатываемыеСсылки Цикл
    ОбработатьЧтоТо(Ссылка);
  КонецЦикла:
КонецПроцедуры
Показать


Сохранение значения константы в переменной с дальнейшим распихиванием этой переменной в списки параметров всех вызываемых с ее использованием процедур и функций, как на мой взгляд - дурной тон.
Значительно элегантнее будет решение вида:

Процедура ОбработатьЧтоТо(Ссылка)
  Если ОбщийМодульПовтИсп.ЛюбаяКонстантаПолучить() Тогда
    //...
  КонецЕсли;
КонецПроцедуры

Процедура ОбработатьВсе()
  Для Каждого Ссылка Из ОбрабатываемыеСсылки Цикл
    ОбработатьЧтоТо(Ссылка);
  КонецЦикла:
КонецПроцедуры
Показать
38. profiprog1c 184 10.11.17 13:27 Сейчас в теме
(37) Вы давно 1С занимаетесь или недавно? Давайте уже включайте соображаловку. Учить азам я вас не буду. Константу 1 раз получаете в Процедуре ОбработатьВсе() до цикла, после передаете ее в Процедуру ОбработатьЧтоТо(Ссылка, НашаКонстанта) в цикле. Все просто.
Еще раз говорю, не нужно пытаться придумывать пользу от получения констант, займитесь программированием наконец.
40. Hobbit_Jedi 10.11.17 16:56 Сейчас в теме
(38)
после передаете ее в Процедуру ОбработатьЧтоТо(Ссылка, НашаКонстанта) в цикле

Ага. Особенно если таких процедур штук двадцать... И они вызывают еще другие процедуры... А те в свою очередь еще процедуры... Везде добавляем аргумент со значением константы и передаем его?...
Как на мой взгляд, не самое лучшее архитектурное решение. Особенно, если добавленный аргумент в списке аргументов процедур как "не пришей кобыле хвост" смотрится (в том смысле, что не имеет отношения к решаемым процедурами задачам).
Но если Вы относитесь к программистам, не сильно заморачивающимся изяществом архитектуры, а стремящимся на скорую руку удовлетворить клиента (а заодно обеспечить себя в будущем большим количеством работы), тогда да - Ваше решение значительно эффективнее в достижении этих целей.
sommid; mvgfirst; +2 1 Ответить
41. profiprog1c 184 10.11.17 18:19 Сейчас в теме
(40) Двадцать процедур, тридцать процедур. Давайте придумывайте сферического коня в вакууме. Вы написали конкретный код и я вам написал, как правильно программировать. Еще раз, у меня нет желания вас учить основам программирования. Продолжайте фантазировать на тему констант и двадцати тридцати процедур. Читать забавно
42. Hobbit_Jedi 11.11.17 00:34 Сейчас в теме
(41)
Вы написали конкретный код и я вам написал, как правильно программировать.

Я привел ПРИМЕР кода. Естественно, максимально его упростив, т.к. 50 экранов текста никто читать не будет. А если у Вас недостаточно опыта, чтобы с помощью этого простого примера вспомнить реальный код соответствующего масштаба, то помалкивали бы тихонечко. И хотя бы типовые конфигурации полистали (как пример идеального кода они, конечно, не подойдут, а вот как пример сложной иерархии вызовов множества процедур - самое оно будет).
Успехов Вам в постижении программирования вообще и тонкостей 1С в частности!
43. Hobbit_Jedi 11.11.17 00:38 Сейчас в теме
(41)
Ну и достану уже "козырную Мантану"....
Представьте себе, что Вам нужно читать значение константы в обработчике события, например ПриОтправкеДанныхПодчиненному, объекта плана обмена.
Интересно, где Вы предлагаете определить переменную? Где Вы предлагаете ее инициализировать прочитанным из константы значением? И самое главное - как Вы предлагаете передавать значение этой переменной в обработчик события, который при выгрузке данных на узел вызывается тысячи раз (по количеству выгружаемых объектов данных)?
Вряд ли Вы сможете ускорить процесс выгрузки не используя кэшируемые общие модули. :)
46. profiprog1c 184 13.11.17 13:39 Сейчас в теме
(43) "Козырная Монтана"??? Мне что-то смешно. Ладно. Вот "корызная Монтана". Я только что написал обработчик, который 50000 раз читает константу. Все это заняло 14 секунд. Так вот, если вы в реальном программировании используете такие циклы, на 50 тыс. раз, то эти 14 секунд ни на что влиять не будут. Так что советую изучить, что такое "производительность" и что реально требует оптимизации в реальном программировании, а не в Сферическом коне в вакууме, который вы мне тут упорно расписываете.
47. Hobbit_Jedi 13.11.17 15:55 Сейчас в теме
(46) Иногда, 14 секунд - это очень долго.
К тому же помня, что "Сила мелочей - в их количестве"(С)Народ... очень часто приходится сталкиваться с вроде бы равномерно-тормозящим кодом (где оптимизировать вроде бы нечего), который путем "Сферических" оптимизаций можно ускорить раза в три.
Если код изначально писать оптимально (с точки зрения Сферического коня в вакууме), то зачастую, как Вы выразились "реальные оптимизации в реальном программировании" - не требуются вообще.
Хотя да - это мы с Вами уже в Холивар проваливаемся. У каждого свой путь на ниве программирования.
53. Rustig 1194 15.03.18 09:27 Сейчас в теме
(43) о какой константе идет речь? пишите конкретно!
сформулируйте четкую задачу, что нужно проверять при выгрузке в обработчике события?
я сталкивался с тем, что одну и ту же задачу для разных бизнесов и масштабов приходится решать по разному. поэтому правильно исходить от конкретной задачи - от вас нужны детали, детали, детали - пример с константами и вызовами процедур общих модулей - это совсем не годится - из ничего придумали что-то сложное
52. Rustig 1194 15.03.18 09:22 Сейчас в теме
(37) не люблю теории про универсальные решения - каждая задача имеет свое красивое решение, не подходящее для других бизнесов и других масштабов - а вы тут разводите абсолютно идеальное решение неизвестно какой задачи.
36. Yashazz 2853 08.09.17 12:30 Сейчас в теме
Да тема вообще практически не раскрыта. Ни срок жизни этого кэша, ни где он лежит (в сеансовых данных аль ишшо где), ни различия тонкого и толстого, ни различия повт.исп. на сервере и на клиенте... Можно было определить границу эффективности, за которой такое кэширование становится вредным и тормозным; можно было сравнить с параметром сеанса и его поведением; с поведением глобальных переменных модуля приложения, итд... Я уж не говорю о специфических вещах, как-то кэширование значения типа веб-прокси или ком-объект))

Ниочёмка с умным видом. Единственная заслуга статьи, за которую я плюсанул тоже - дискуссия пошла. Вот из дискуссии можно полезное почерпнуть.
Daynestro07; vano-ekt; spetzpozh; +3 Ответить
45. unichkin 1199 11.11.17 12:21 Сейчас в теме
Некоторые константы удобнее кэшировать в параметры сеанса.. Вообще у меня в ПовтИсп есть такой метод:
Функция ЗначениеКонстанты(ИмяКонстанты, ПолучатьДанныеХранилища = Ложь) Экспорт		
	ЗначениеКонстанты = Константы[ИмяКонстанты].Получить();	
	Если ПолучатьДанныеХранилища И ТипЗнч(ЗначениеКонстанты) = Тип("ХранилищеЗначения") Тогда
		ЗначениеКонстанты  = ЗначениеКонстанты.Получить();		
	КонецЕсли; 
	
	Возврат ЗначениеКонстанты;
	
КонецФункции
Показать
48. pvlunegov 142 14.11.17 15:57 Сейчас в теме
Батенька, здесь в узких кругах народы привыкли к диссертациям в виде статей, а вы тут статейку написали, вот и ругаются, читать много букоф...

Мои мысли о применении фичи:
1. Мониторинг изменения данных в одной функции общего модуля с признаком повторные использование.
2. В функции получаем нужный список реквизитов нужного объекта метаданных. Храним значения в кешированной таблице.
3. Функцию получения реквизитов загоняем в цикл и гоняем туда сюда.
4. При изменении данных в существующих объектах, запускается отдельная процедура по проверке изменений.
5. Если изменения запрещены по определенному алгоритму - создаем электронное письмо администратору.

Как работает механизм:
1. Большие объемы изменения данных.
2. В момент изменения данных максимальная свобода и производительность системы без дополнительных проверок.
3. Все проверки в режиме оффлайн.
4. Проверка изменений осуществляется в оффлайн с помощью кеширования реквизитов и сравнения с существующими в базе.
5. Если реквизиты изменены не по правилам, то кеш сохраняется в файл на диске, админу 1с приходит письмо с описанием проблемы.
6. Админ разбирается в правомерности изменения данных.
7. Если изменение данных запрещено правилами, можно восстановить реквизиты из кеша, который сохранен на диск.

Плюсы:
1. Максимальная свобода изменения данных в базе.
2. Минимум проверок при записи в БД.
3. Высокая производительность.
4. Проверки делаются отдельно.

Минусы.
1. При большом количестве изменений кеши изменений будут очень большими, нужно место для хранения кешей таблиц.
49. zakiap 16.11.17 08:18 Сейчас в теме
А я использую так:
Функция Получить_ТаблицаЗначений(_имя) Экспорт
	Возврат Новый ТаблицаЗначений;
КонецФункции


далее

КешДокументов = КЭШ.Получить_ТаблицаЗначений("КешДокументов");
......
54. redtram 6 03.04.18 13:13 Сейчас в теме
(49) работает? Если я правильно понял, то мы просто получаем таблицу значений (допустим запросили с клиента, кэш упал в клиента), наполняем ее (наполняется ли она в клиентском кэше? а в серверном?), в дальнейших вызовах получаем только ссылку на эту ТЗ?

Также вопрос ко всем. Повторное использование общее для всех сеансов (т.е. зависит только от входящих параметров)?
56. Vahnin 08.11.18 13:33 Сейчас в теме
Коллеги, не забывайте, пожалуйста, про стандарты от 1С
https://its.1c.ru/db/v8std/content/2149184296/hdoc
Всеми любимое слово "Получить" в именах функций 1С использовать не рекомендует.

P.S. Не нашел информации, где все-таки хранится кэш (клиента и сервера), в tempdb, в файлике в AppData или еще где. Есть у кого инфа?
60. a.x 23.11.18 07:29 Сейчас в теме
(56)

Не нашел по указанной ссылке запрета на использование слова "Получить" в именах методов.
57. Vahnin 08.11.18 13:36 Сейчас в теме
Коллеги, не забывайте, пожалуйста, про стандарты от 1С
https://its.1c.ru/db/v8std/content/2149184296/hdoc
Всеми любимое слово "Получить" в именах функций 1С использовать не рекомендует (прямо, конечно, это не указано).

P.S. Не нашел информации, где все-таки хранится кэш (клиента и сервера), в tempdb, в файлике в AppData или еще где. Есть у кого инфа?
59. a.x 22.11.18 05:49 Сейчас в теме
Полезный, с моей точки зрения, вариант использования модуля с повторным использованием - замена магических констант в коде. Например:

Что было (и это я видел даже в типовых)
    ...
    ОбрабатываемаяДата = ОбрабатываемаяДата + 86400;
    ...


Добавляем модуль с повторным использованием, назовем его ДемистификацияКонстант.
Функция ОдниСутки() Экспорт
    
    Возврат 24 * 60 * 60; // Часы, минуты, секунды.
    
    // А ещё лучше вот так.
    ОдниСутки_ = '2018-11-22' - '2018-11-21';
    Возврат ОдниСутки_;
    
КонецФункции
Показать


Что стало
    ...
    ОбрабатываемаяДата = ОбрабатываемаяДата + ДемистификацияКонстант.ОдниСутки();
    ...
suepifanov; +1 Ответить
Оставьте свое сообщение

См. также

Агрегатные функции СКД, о которых мало кто знает 316

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

Пользуетесь ли Вы всеми возможными агрегатными функциями, которые предоставляет система компоновки данных? Если Вы используете только: СУММА, КОЛИЧЕСТВО, МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ, то эта статья для Вас.

05.09.2019    9834    ids79    42       

Три костыля. Сказ про фокусы в коде 121

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования Разработка

Три интересных (или странных) костыля в коде, которые могут помочь в повседневных и не очень задачах.

03.09.2019    7725    YPermitin    67       

Отслеживание выполнения фонового задания 133

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Универсальные функции Разработка

Запуск фонового задания из модуля внешней обработки. Отслеживание выполнения задания в виде прогресса, расположенного на форме.

17.08.2019    8148    ids79    14       

Функции СКД: ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив 241

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

Подробное описание и использование внутренних функций системы компоновки данных: Вычислить, ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив, ВычислитьВыражениеСГруппировкойТаблицаЗначений.

08.08.2019    10262    ids79    24       

Фоновое выполнение кода в 1С - это просто 117

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Разработка

Как легко запускать выполнение в фоне, не прибегая к долгому описанию фоновых процедур.

02.08.2019    9728    avalakh    21       

СКД - наборы данных и связи между ними, создание собственной иерархии, вложенные отчеты 126

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования Разработка

Набор данных объект. Использование в схеме компоновки нескольких наборов данных. Различные варианты связи наборов: объединение, соединение. Использование иерархии в отчетах на СКД. Создание собственной иерархии, иерархия детальных записей. Использование вложенных схем в отчетах на СКД.

26.07.2019    9183    ids79    6       

СКД - использование расширений языка запросов, секция ХАРАКТЕРИСТИКИ 134

Статья Программист Нет файла v8 v8::СКД Бесплатно (free) Инструментарий разработчика Практика программирования Разработка

Автоматическое и не автоматическое заполнение полей компоновки данных. Использование расширений языка запросов для СКД «{…}», секция ВЫБРАТЬ, секция ГДЕ, параметры виртуальных таблиц. Автоматизированное использование дополнительных данных в запросе: секция ХАРАКТЕРИСТИКИ.

17.07.2019    8612    ids79    24       

"Меньше копипаста!", или как Вася универсальную процедуру писал 170

Статья Программист Стажер Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования Разработка

Программист Вася разбирает подход создания универсальных методов на примере программного вывода СКД.

04.07.2019    6177    SeiOkami    48       

Создание отчетов с помощью СКД - основные понятия и элементы 192

Статья Программист Нет файла v8 v8::СКД Бесплатно (free) Практика программирования Математика и алгоритмы

Основные принципы работы СКД. Понятия схемы компоновки и макета компоновки. Описание основных элементов схемы компоновки: наборы данных, поля, вычисляемые поля, ресурсы, параметры.

25.06.2019    17302    ids79    16       

Многопоточное ускорение однопользовательских нагрузок в 1С + Microsoft SQL Server 2017 176

Статья Программист Нет файла v8 v8::Запросы Бесплатно (free) Практика программирования Разработка

Взаимодействие с Microsoft SQL Server нередко вызывает трудности у 1С-ников, а потому интересны любые моменты, связанные с его использованием. О своем опыте работы с новым SQL Server 2017 участникам конференции Infostart-2018 рассказал директор ООО «Аналитика софт» Дмитрий Дудин.

11.06.2019    11470    dmurk    134       

Регистры накопления. Структура хранения в базе данных 174

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Разработка

Структура хранения регистров накопления в базе данных для платформы 1С:Предприятие 8.x. Первая часть в серии публикаций.

16.05.2019    17150    YPermitin    27       

Выполнение внешней обработки в фоновом задании 147

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Разработка

Подробное описание подхода к созданию длительной операции на основе внешней обработки. Реализация протестирована на 1С 8.3.12.1714 (x64).

11.05.2019    9760    Eret1k    22       

Выгрузка документа по условию 5

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования Разработка

Что делать, если документы нужно выгружать не все подряд, а по какому-то фильтру: статусу, дате, набору условий... А что если он соответствовал этим условиям, а потом перестал? А если потом опять начал? Такие ситуации заставили попотеть не одного программиста.

25.04.2019    4765    m-rv    2       

Как прикрутить ГУИД к регистру сведений 23

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования Перенос данных из 1C8 в 1C8 Разработка

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

16.04.2019    7298    m-rv    16       

О расширениях замолвите слово... 192

Статья Программист Стажер Нет файла v8 Бесплатно (free) Практика программирования Разработка

О чём стоит задуматься при принятии решения о создании расширения конфигурации…

07.04.2019    16284    ellavs    122       

Git-репозитории для 1С-кода (опыт использования при небольших проектах) 200

Статья Программист Стажер Нет файла v8 Windows Бесплатно (free) Практика программирования Разработка

Инструкции по взаимодействию с Git-репозиторием, которые писались для тех наших программистов, которые вообще никогда не работали с Git (руководства в духе "Как получить код из git-репозитория?", "Как отправить код в git-репозиторий")...

28.03.2019    12650    ellavs    83       

Трюки с внешними источниками данных 164

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Разработка

Некоторые трюки для преодоления ограничений внешних источников данных.

14.03.2019    12769    YPermitin    52       

Возможности типовых шаблонов ограничения доступа на уровне записей (RLS) 162

Статья Программист Нет файла v8 v8::Права Бесплатно (free) Практика программирования БСП (Библиотека стандартных подсистем) Роли и права

Краткий обзор применения типовых шаблонов ограничения доступа на уровне записей в конфигурациях, созданных на базе БСП: #ПоЗначениям, #ПоНаборамЗначений, #ПоЗначениямРасширенный, #ПоЗначениямИНаборамРасширенный

03.02.2019    15368    ids79    9       

EnterpriseData – часть 2. Процесс выгрузки данных 127

Статья Программист Нет файла v8 v8::УФ Россия Бесплатно (free) Практика программирования Обмен через XML

Основные этапы выгрузки данных через ED, обработчики событий выгрузки, правила обработки данных, правила конвертации объектов, конвертация свойств первого и второго этапов, процедуры БСП, используемые при выгрузке данных, структура «КомпонентыОбмена».

26.12.2018    12659    ids79    27       

Новый подход к обмену данными EnterpriseData 203

Статья Программист Нет файла v8 v8::УФ Россия Бесплатно (free) Практика программирования Обмен через XML

Хочу предложить Вашему вниманию цикл статей, посвященных обмену данными через универсальный формат (EnterpriseData или ED).

14.12.2018    21317    ids79    72       

EnterpriseData - пример доработки правил конвертации без использования КД 3.0 в расширении конфигурации 118

Статья Программист Нет файла v8 v8::УФ БП3.0 УТ11 Россия Windows Бесплатно (free) Практика программирования Обмен через XML

В статье подробно описан реальный пример доработки обмена данными через EnterpriseData (универсальный формат обмена) между конфигурациями УТ 11.4 и Бухгалтерия 3.0

16.11.2018    18830    ids79    20       

Программное заполнение пользовательских параметров и отборов СКД 135

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

Публикация представляет из себя краткие примеры того, как можно заполнять параметры СКД программно так, чтобы все параметры и отборы были доступны в быстрых настройках и в обычных (типовых) настройках параметров и отборов СКД.

13.11.2018    19515    Unk92    18       

Автоматические и управляемые блокировки применительно к типовым конфигурациям 1С 126

Статья Программист Нет файла v8 v8::blocking 1cv8.cf Бесплатно (free) Математика и алгоритмы Практика программирования

Основные принципы работы с режимами автоматических и управляемых блокировок в 1С Предприятие 8. Теория и применение в типовых конфигурациях: БП, УТ, ЕРП

10.11.2018    20757    ids79    40       

Вспомогательные инструкции в коде 1С 104

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования

Помогаем редактору кода 1С помогать нам писать и анализировать код.

15.10.2018    20383    tormozit    100       

Произвольный код в фоновом режиме 164

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования

Задача: реализовать выполнение произвольного кода в фоновом режиме без изменения конфигурации, т.е. во внешней обработке.

03.09.2018    14531    nikita0832    41       

Основные понятия и механизмы оптимизации клиент-серверного взаимодействия в 1C 144

Статья Программист Нет файла v8 Россия Бесплатно (free) Математика и алгоритмы Практика программирования

У многих начинающих 1С программистов часто возникают вопросы про клиент-серверное взаимодействие в 1С и чтобы разобраться в непростых механизмах платформы, необходимо понять, что же такое контекст, для чего предназначены директивы компиляции, что представляют собой контекстные/внеконтекстные вызовы и как наиболее оптимально описывать прикладные задачи в модулях управляемых форм.

23.08.2018    21151    Rain88    42       

Повышаем эффективность разработки правил обмена 123

Статья Программист Нет файла v8 КД ОС Бесплатно (free) Практика программирования Перенос данных из 1C8 в 1C8

Как повысить скорость и качество разработки правил обмена? Как вести групповую разработку правил обмена? Как облегчить сопровождение правил обмена после передачи в эксплуатацию? Об этом и многом другом вы можете узнать из этой статьи.

25.06.2018    19252    olegtymko    47       

Передача данных между сеансами и Повторное использование значений между сеансами 42

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования

Вам никогда не хотелось в одном сеансе повторно использовать значения, однажды уже вычисленные в другом сеансе?

09.06.2018    9478    m-rv    11       

Введение в механизм представлений в ЗУП ред. 3 152

Статья Программист Нет файла v8 v8::СПР ЗУП3.x Бесплатно (free) Практика программирования

В нашей организации на первом же телефонном собеседовании на должность разработчика по ЗУП ред. 3 вас обязательно спросят о том, что такое "Представления".

04.06.2018    24275    xrrg    82       

Как сделать запрос на изменение данных 75

Статья Программист Нет файла v8 v8::Запросы 1cv8.cf Бесплатно (free) Практика программирования

В статье приведены особенности внутренней архитектуры и примеры работы с расширением языка запросов 1С.

01.06.2018    21126    m-rv    21       

Строим графы средствами 1С (без GraphViz) 42

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования

Множество статей на Инфостарте описывают, как работать с компонентой GraphViz, чтобы построить ориентированный граф. Но практически нет материалов, как работать с такими графами средствами 1С. Сегодня я расскажу, как красиво строить графы с минимальным пересечением. Нам этот метод пригодился для отрисовки алгоритмов в БИТ.Финансе, т.к. типовой механизм не устраивал. Еще это может быть полезно для визуализации различных зависимостей: расчета себестоимости, графы аффилированности компаний и т.д. Надеюсь, эта статья поможет сделать мир 1С красивее и гармоничней:) Итак, поехали...

23.05.2018    16917    slozhenikin_com    19       

Распределение расходов пропорционально продажам 9

Статья Программист Пользователь Нет файла v8 v8::ОУ УТ10 УУ Финансовый учет и бюджетирование (FRP) Учет доходов и расходов Бесплатно (free) Практика программирования

Финансовая модель. Распределение административных расходов по подразделениям пропорционально продажам за месяц. Дополнительные реквизиты против бизнес-процессов!

13.05.2018    11296    Rustig    9       

Просмотр временных таблиц запроса в отладчике без изменения кода 126

Статья Программист Нет файла v8 v8::Запросы 1cv8.cf Бесплатно (free) Практика программирования

Данный способ можно использовать для просмотра содержимого временных таблиц запросов (менеджеров временных таблиц) без внесения изменений в код.

24.04.2018    24278    avfed@rambler.ru    19       

Минимализмы 3 350

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования Универсальные функции

Очередная серия "минимализмов" [http://infostart.ru/public/306536/, https://infostart.ru/public/460935/]. Также, как и в предыдущих статьях, здесь приведена подборка коротких оригинальных авторских решений некоторых задач. Ранее эти решения были разбросаны по моим комментариям к чужим публикациям.

19.02.2018    35482    ildarovich    44       

Этюды по программированию. Взаимодействие с Microsoft Word 109

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования

Часто приходится заниматься созданием сложных документов Word с таблицами, вложенными фрагментами, хитрым оформлением и прочими радостями жизни. Это - попытка как-то структурировать полученный опыт, чтобы не приходилось перерывать ворох старых обработок в поисках крупиц истины. Надеюсь, эта статья будет полезна и Вам.

11.12.2017    25786    milkers    23       

Метод формирования движений в типовых регистрах нетиповыми регистраторами 31

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования

Вариант решения задач с проведением по типовым регистрам нетиповыми регистраторами. Зачем - чтобы при сравнении конфигурации не обращать внимание на свойства регистров и исключить вероятность допущения горькой оплошности при обновлении информационных баз, заменив типы регистраторов основной конфигурации типами конфигурации поставщика. Для программных продуктов, имеющих в своем составе метаданных документ "Корректировка регистров"("Корректировка записей регистров").

05.12.2017    21265    itriot11    34       

1С: Конвертация данных 3. Инструкции и примеры. EnterpriseData (универсальный формат обмена) 720

Статья Программист Нет файла v8 КД Бесплатно (free) Перенос данных из 1C8 в 1C8 Практика программирования Обмен через XML

Что такое КД3? Как начать использовать? Полезные дополнения к документации. Что нужно исправить в типовых обработках и конфигурации. Как изменить правила обмена не снимая конфигурацию с поддержки. Как отлаживать правила обмена?

19.11.2017    137295    MaxS    251       

Заполнение данных по ИНН контрагента с помощью альтернативного сервиса огрн.онлайн 131

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования

Код для заполнения данных по ИНН контрагента из ЕГРЮЛ с сайта огрн.онлайн.

01.11.2017    22642    slava_1c    49       

Программные перечисления, ч.2: приемы кэширования при разработке 66

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования

Все знают, что такое кэш, и зачем он нужен. Но в 1С разработчик обычно использует кэширование только на уровне конфигурации, а в какой-нибудь обработке скорее ломает голову над запросом - как получить все данные за один заход... Хочется рассказать о том, как можно добиться хороших результатов с стратегией "разделяй и властвуй".

30.10.2017    21007    unichkin    17       

Разбираемся с настройками компоновки данных 159

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

Краткая шпаргалка по программной работе с настройками СКД

29.10.2017    23979    json    9       

Работа с Excel 288

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования Загрузка и выгрузка в Excel

Собрал различные полезности для работы с Excel из 1С. Иногда приходится форматировать документ Excel программно из 1С. Так вот, чтобы не искать постоянно на просторах интернета как сделать левое выравнивание в ячейке Excel из 1С и т.п. решил опубликовать это...

23.10.2017    24571    arakelyan    39       

Добавление команд печати в конфигурациях на БСП 2.4.3 (в частности, в самописных документах в Бухгалтерии 3.0 после релиза 3.0.52.35) 143

Статья Программист Нет файла v8 v8::БУ БП3.0 Россия Бесплатно (free) Печатные формы документов Практика программирования БСП (Библиотека стандартных подсистем)

В статье https://infostart.ru/public/237013/ пользователя nick max рассматривался список действий для подключения команд печати в Бухгалтерии 3.0, работающей на БСП 2.3.6. В новом релизе Бухгалтерии 3.0.52.35 от 15.09.2017г. стала использоваться БСП 2.4.3, из-за чего произошли изменения в процедурах общих модулей, связанных с механизмом печати, и в процедурах их вызова в формах документов и в формах списков. Рассмотрим их.

18.09.2017    46672    bugtester    43