Опять двойка!

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

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

57
Продолжение тем, связанных с использованием степеней двойки «Порождающий запрос» [http://infostart.ru/public/90367/] «Транзитивное замыкание запросом» [http://infostart.ru/public/158512/] На этот раз речь пойдет об операциях со строками.

Данная статья касается особенностей выполнения операций над строками в языке программирования платформы «1С: Предприятие» и проблемы медленной конкатенации строк, возникающей, если эти особенности не учитываются. Приводятся две новые полезные функции, позволяющие обходить указанную проблему.

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

Функция ПростойОтжим(Текст, Ответ = "", Было = "") Экспорт

    Для
ё = 1 По СтрДлина(Текст) Цикл Стало = Сред(Текст, ё, 1); Ответ = Ответ + ?(Было + Стало = "  ", "", Стало); Было = Стало КонецЦикла;

    Возврат
Ответ

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

На первый взгляд кажется, что никакого подвоха в этом коде нет. Однако на самом деле на длинных строках такая функция работает невероятно долго. Дело в том, что в цикле здесь используется простая по виду конструкция, которая дописывает справа к получаемой строке один значащий (не пробельный) символ. По замерам времени выполнения можно заключить, что в 1С такая конструкция работает примерно так: выделяется область памяти на один символ длиннее, чем строка, накапливающая результат, затем ВСЕ содержимое этой строки копируется в новую область, а добавляемый символ записывается справа. Следовательно, при удлинении всего на один символ строки длины в тысячу символов в оперативной памяти придется перенести целый килобайт данных (или два, если речь идет о юникоде)! А эта операция выполняется в цикле, повторяющемся для каждого символа новой строки! Последовательная посимвольная конкатенация в процессе накопления строки иллюстрируется следующей схемой:

Схема конкатенации

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

График зависимости

График получен в результате работы следующей процедуры:

Процедура ТестВремениКонкатенации()

   
Текст = "";

    Для
ё = 1 По 32 Цикл

       
Старт = ТочноеТекущееВремя();

        Для
ж = 1 По 16384 Цикл Текст = Текст + "а" КонецЦикла;

       
Сообщить("" + 16384 * ё + ":" + (ТочноеТекущееВремя() - Старт))

    КонецЦикла

КонецПроцедуры

Анализируя график, можно сделать еще один интересный практический вывод: обработка строк, длиннее, чем примерно 262144 символа производится платформой существенно дольше, чем обработка более коротких строк. Возможно, такие строки размещаются непосредственно на диске (есть и другие предположения).
Тем не менее, существует простое решение, позволяющее обойти при решении рассматриваемой задачи указанную проблему медленной конкатенации строк. Это решение имеет определенную аналогию с ранее предложенными приемами построения запросов и представлено следующей функцией «отжима пробелов»:

Функция ДвойнойОтжим(Знач Текст) Экспорт

    Для
ё = 1 По Log(СтрДлина(Текст)) / Log(2) + 1 Цикл Текст = СтрЗаменить(Текст, "  ", " ")

    КонецЦикла;

    Возврат
Текст

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

В этой функции каждая итерация цикла уменьшает длину цепочки пробелов в два раза. Поэтому даже если строка состоит из одних пробелов, на ее «отжим» понадобится не больше чем  ] log2(N) [ итераций цикла, где N – исходная длина строки. Работа функции иллюстрируется следующей схемой:

Схема работы функции

На длинных строках такая функция работает приемлемое время, что показывает отчет, приложенный к статье. Строку из миллиона символов функция обрабатывает примерно за 200 миллисекунд. Скачавшие отчет смогут замерить (если хватит терпения) и время выполнения более очевидной функции «простого отжима» в зависимости от длины текста и процентного содержания пробелов в нем.
Кроме того, возможно, в коде отчета окажется интересным прием генерации «случайного» тестового текста с использованием «таблицы хаоса» из статьи "Порождающий запрос" [//infostart.ru/public/90367/].
Нужно сказать, что предлагаемая функция «двойного отжима» более известна в виде функции «условного отжима»:

Функция УсловныйОтжим(Знач Текст) Экспорт

    Пока
Найти(Текст, "  ") Цикл Текст = СтрЗаменить(Текст, "  ", " ")

    КонецЦикла;

    Возврат
Текст

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

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

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

Функция Строчка(Массив, От, До)

    Возврат ?(
От = До, Массив[От], Строчка(Массив, От, Цел((От + До) / 2)) + Строчка(Массив, Цел((От + До) / 2) + 1, До))

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

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

Схема работы рекурсивной функции 

Например, массив из миллиона символов преобразуется в строку примерно за 20 секунд. ВНИМАНИЕ! Эта запись функции предполагает, что параметр «От» всегда меньше или равен параметру «До». 
Однако здесь следует сказать, что для преобразования массива символов в строку существует несколько более быстрый способ. Он основан на использовании функции «ЗначениеВСтрокуВнутр»

Функция ВСтроку(Массив) Экспорт

    Возврат
Сред(СтрЗаменить(ЗначениеВСтрокуВнутр(Массив), """}," + Символы.ПС + "{""S"",""", ""), 53 + СтрДлина(Формат(Массив.Количество(), "ЧГ=")), Массив.Количество())

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

В этом варианте записи функции считается, что все элементы массива – это строки длиной в один символ. Ограничение длины легко преодолевается при чуть более сложной записи, а вот если в массиве могут оказаться данные разных типов, то, возможно, выгоднее будет применять рекурсивную функцию.
Для быстрого преобразования исходной строки в массив для ее обработки в таком виде можно использовать прием из статьи «Порождающий запрос»[//infostart.ru/public/90367/]. Там этот прием использовался в задачах подсчета частоты символов и подсчета частоты слов в тексте.
В результате комбинация всех этих приемов позволяет решить, например, задачу быстрой транлитерации большого текста, представление текста первыми буквами всех его слов и тому подобные задачи, не решаемые комбинациями стандартных операций над строками.

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

  1. обозначенная проблема медленной конкатенации строк и показанная зависимость времени обработки от длины строк будет учитываться в практике программирования для платформы «1С: Предприятие»;
  2. приведенные функции окажутся востребованными, так как сокращают время выполнения часто используемых операций над строками;
  3. по аналогии с приведенными функциями и на их основе будут построены другие полезные функции обработки строк;
  4. анализ приведенных функций позволит лучше понять преимущества методов из статей «Порождающий запрос» [//infostart.ru/public/90367/], «Транзитивное замыкание запросом»[//infostart.ru/public/158512/], поскольку предлагаемые приемы и контрприемы имеют общую математическую основу.
57

Скачать файлы

Наименование Файл Версия Размер
Отчет ДвойнойОтжим
.erf 8,58Kb
25.11.12
10
.erf 8,58Kb 10 Скачать

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

Комментарии
Избранное Подписка Сортировка: Древо
1. DoctorRoza 26.11.12 09:51 Сейчас в теме
Скажите, а как часто у Вас появляется необходимость в использовании соединения строк, букв? В моей, скромной практике такое случается редко да и то когда нужно в, например, отчете соединить, типа - "Итого: " + Строка(Сумма). Но за работу плюс! :)
8. ildarovich 6731 26.11.12 10:58 Сейчас в теме
(1) Довольно часто. Однако понятно, что эффект проявляется только на длинных строках, работать с которыми приходится реже. Я не такой фанат, чтобы вместо "а" + "б" + "р" + "а" + "к" + "а" + "д" + "а" + "б" + "р" + "а" писать ((("а" + "б") + "р")+ (("а" + "к") + "а")) + ((("д" + "а") + "б") + ("р" + "а")), хотя из статьи следует, что эта запись быстрее.
Очень часто приходится удалять лишние пробелы в наименованиях. Для меня открытием было то, что метод "условного отжима", который я использовал лишь для краткости записи, ОКАЗАЛСЯ ТАК ЭФФЕКТИВЕН.
2. orefkov 1975 26.11.12 10:42 Сейчас в теме
Резкие тормоза после 262144 - не связаны с записью на диск.
Скорее всего, это связано с менеджером выделения памяти, сделанном в 1С.
Видимо блоки размером до 0x40000 (а это и есть 262144) выделяются 1Ской из заранее выделенного пула, а за блоками большей длины аллокатор каждый раз обращается к ОС. Хотя это навскидку, детально код из "stl82.dll :: operator new" я не исследовал.
RailMen; tormozit; Serj1C; +3 Ответить
5. ildarovich 6731 26.11.12 10:50 Сейчас в теме
(2) Да, такое объяснение больше похоже на правду. Для себя не вижу большой необходимости докапываться до первопричин в этом вопросе. Важнее зафиксировать обстоятельства возникновения эффекта и учесть его в разработке.
6. orefkov 1975 26.11.12 10:52 Сейчас в теме
+(2)
Либо еще возможный вариант увеличения тормозов - до данного размера память в строке выделяется с запасом (т.е. например под строку в 17 символа память выделяется сразу для 32 символов, и пока строка не увеличится до 32 символов - перевыделения памяти и копирования символов не происходит, а потом сразу выделяется для 64 символов), а после этой магической константы память выделяется тютелька в тютельку каждый раз.
3. djd.sf 26.11.12 10:45 Сейчас в теме
интересно было бы посмотреть сравнение с ФорматированнаяСтрока из 8.3.
4. orefkov 1975 26.11.12 10:47 Сейчас в теме
Ну и кроме того, во многих языках тупая работа со сложением строк неэффективна, и рекомендуется для этих целей использовать либо спец-объекты (StringBuilder в C# например), либо затачивать алгоритм.
7. djd.sf 26.11.12 10:52 Сейчас в теме
в шарпе строки(String) иммутабельны, насколько мне известно, поэтому и неэффективно, для этого и существует класс StringBuilder . Что в 1С делать непонятно. (ВК писать нет никакого смысла). Вот ФорматированнаяСтрока появилась в 8.3.
9. WKBAPKA 211 26.11.12 17:43 Сейчас в теме

Функция ПростойОтжим(Текст, Ответ = "", Было = "") Экспорт

Для ё = 1 По СтрДлина(Текст) Цикл Стало = Сред(Текст, ё, 1); Ответ = Ответ + ?(Было + Стало = " ", "", Стало); Было = Стало КонецЦикла;

Возврат Ответ

КонецФункции
На первый взгляд кажется, что никакого подвоха в этом коде нет.


уже в этом тексте можно немного оптимизировать код, например, СтрДлина() вызвать до цикла и один раз :)

а вызвать функцию СтрЗаменить() не быстрее было бы, например

РезТекст = СтрЗаменить(Текст," ","");
10. ildarovich 6731 26.11.12 18:14 Сейчас в теме
(9) Не согласен:
- Выражение "По" в заголовке цикла "Для" считается ОДИН РАЗ (только что еще раз проверил);
- Менять пробел на пустышку так нельзя, так как ОДИН пробел между словами по условиям задачи должен остаться.
VVladislav; Al-X; bulpi; +3 Ответить
17. bulpi 157 28.11.12 15:22 Сейчас в теме
(10)
"Выражение "По" в заголовке цикла "Для" считается ОДИН РАЗ "

Таки да! Я в шоке. Век живи, век учись.
11. devel0per 1 27.11.12 01:08 Сейчас в теме
Для работы с крупноразмерными текстами
меня еще моя бабушка учила юзать XSLT:
Процедура Тест1()
СтрXML = "<?xml version=""1.0"" encoding=""UTF-8""?>
|
|<text>
|	Примерчик,   с
|  большим     количеством                 лишненьких,
|	   случайненьких                           пробельчиков  
|	от     которых          мы хотим         
|                  отчесаться.
|
|</text>";

Преобразование = Новый ПреобразованиеXSL;
СтрокаXSLT = "<?xml version=""1.0""?>
|<xsl:stylesheet version=""1.0""           
|     xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">
|
|  <xsl:output method=""xml""   
|       omit-xml-declaration=""yes""/>
|
|<xsl:template match=""/text"">
|До: 
|<xsl:value-of select='.'/>
|Опосля: <xsl:value-of select='normalize-space()'/>
|</xsl:template>
|
|</xsl:stylesheet>";

Преобразование.ЗагрузитьИзСтроки(СтрокаXSLT);
СтрРез = Преобразование.ПреобразоватьИзСтроки(СтрXML);
Сообщить(СтрРез);

КонецПроцедуры

&НаКлиенте
Процедура Команда1(Команда)
	Тест1();
КонецПроцедуры
Показать
12. ildarovich 6731 27.11.12 14:07 Сейчас в теме
(11)
Если бабушка вам говорит, что без варежек играть в снежки удобнее - значит, это не ваша бабушка.
- А если серьезно, то спасибо за расширение кругозора. Вот только протестировать Ваш метод пока не смог. Переписал его вот в таком виде:
Функция ОтжимXSLT(Текст) Экспорт
	
	СтрXML = "<?xml version=""1.0"" encoding=""UTF-8""?>
	|
	|<text>
	|" + Текст + ".
	|
	|</text>";
	
	Преобразование = Новый ПреобразованиеXSL; 
	
	СтрокаXSLT = "<?xmlversion=""1.0""?>
	|<xsl:stylesheet version=""1.0""           
	|     xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">
	|
	|  <xsl:output method=""xml""   
	|       omit-xml-declaration=""yes""/>
	|
	|<xsl:template match=""/text"">
	|До: 
	|<xsl:value-of select='.'/>
	|Опосля: <xsl:value-of select='normalize-space()'/> </xsl:template>
	|
	|</xsl:stylesheet>";

	Преобразование.ЗагрузитьИзСтроки(СтрокаXSLT);
	
	Возврат Преобразование.ПреобразоватьИзСтроки(СтрXML)
	
КонецФункции
Показать
При вызове получаю ошибку:
{ВнешнийОтчет.ДвойнойОтжим.МодульОбъекта(89)}: Ошибка при вызове метода контекста (ЗагрузитьИзСтроки)
Преобразование.ЗагрузитьИзСтроки(СтрокаXSLT);
по причине:
Ошибка разбора XML: - [1,13]
Фатальная ошибка:
ParsePI: PI xmlversion space expected
13. devel0per 1 27.11.12 22:43 Сейчас в теме
(12)
Караул грабят! Хулиганы на рынке форуме у прохожих пробелы отжимают!
Код
СтрокаXSLT = "<?xmlversion=""1.0""?>
Показать полностью

Я ясно помню!
Код
"xml<ВОТ ЗДЕСЬ/>version" 
Показать полностью
у меня стоял пробел. На каком ходу копи-пасты вы его съели?
Прикрепленные файлы:
14. ildarovich 6731 28.11.12 00:29 Сейчас в теме
(13) Извиняюсь за невнимательность - один пробел действительно "зажал"!
Провел эксперимент. Он показал, что метод с использованием "ПреобразованиеXSL" примерно на 30% медленнее предлагаемого на 1048576 символах теста при 50% заполнении пробелами. При сокращении количества пробелов до 0 проигрыш достигает четырех раз. С помощью прилагаемого отчета это можно проверить самостоятельно.
Прикрепленные файлы:
ДвойнойОтжим_.erf
15. devel0per 1 28.11.12 09:42 Сейчас в теме
(14)
Это был шок! Я просто не мог поверить своим глазам!
Не смотря на то, что мне удалось добиться некоторой прибавки в быстродействии для функции XSLTОтжим,
главным образом, за счет вынесения переменной "Преобразование" в модуль объекта и путём замены output method с xml на text, ваш метод все равно работает быстрее.
Вот значения системных свойств XSLT:
Version: 1.0
Vendor: libxslt
Vendor URL: http://xmlsoft.org/XSLT/
Из этих значений можно предположить, что ваш метод работает быстрее, чем функция из библиотеки libxslt, которая написана на голом Си и входит в состав проекта GNOME.

ildarovich, спасибо за науку!
16. devel0per 1 28.11.12 15:14 Сейчас в теме
(14)
Не давала мне покоя неудача с XSLT. Пришлось снять и выкинуть варежки.
Добавил функцию COMRegExp. Эксперименты показали, что метод с использованием
регулярных выражений быстрее двойного отжима приблизительно в 4-ре раза.
Обработка прилагается.
Прикрепленные файлы:
ДвойнойОтжим_.zip
ildarovich; +1 Ответить
18. ildarovich 6731 28.11.12 18:44 Сейчас в теме
(16) RegExp - это конечно, первое, что приходит в голову, когда речь идет о подобных задачах. Сомневаться в его преимуществах здесь не приходится. Однако, это уже не 1С. Тем не менее спасибо за пример!
19. erdos 28.11.12 23:31 Сейчас в теме
а я думал xlst это не нужная штуковина в 1с
20. i_volodin 04.12.12 15:25 Сейчас в теме
Можно, ли мне внеси маленькую лепту... к "обработкам строк"? Думаю, что обычный отжим Вы сильно тормознули. (Написал было код, да он как оказалось(как обычно) - не работает,) :) - исправлю - напиишу :)
21. i_volodin 04.12.12 16:46 Сейчас в теме
Вот - вроде бы работающий код. Конечно он не обгонит Ваши новшества, но смыл такой, что бы убрать долгую функцию Сред()
Функция ПростойОтжим_2(Знач Текст) Экспорт
	НайденныйПробел = 1;
	Ответ = "";
	//Для П = 1 По СтрДлина(Текст) Цикл
	Пока НайденныйПробел<>0 Цикл
		НайденныйПробел = Найти(Текст, " "); 
		Ответ = Ответ + СокрЛ(Лев(Текст,НайденныйПробел));
		Текст = СокрЛ(Прав(Текст,СтрДлина(Текст)-НайденныйПробел));
	КонецЦикла;
	Возврат Ответ;
КонецФункции
Показать
ildarovich; +1 Ответить
22. ildarovich 6731 04.12.12 17:26 Сейчас в теме
(21) Илья! Ваш вариант мне понравился по двум причинам. Первое - в задаче об "отжиме" пробелов используется СокрЛ - функция "по теме". Второе - он действительно быстрее и из-за Сред(), но, главное (и об этом статья) - использует меньше конкатенаций. Настолько меньше, насколько больше одной буквы средняя длина слова. Если бы было нужно, я бы текст делил, применяя для половинок СокрЛП. В целом считаю Ваш вариант полезным идеями.
Однако для меня поиск решений данной задачи закрыт. Как делается оптимизация в коде 1С вообще - находится близкая по смыслу функция, которая делает "почти то, что нужно", но за один прием. Тут это и сделано по-максимуму. Статью я написал, потому, что меня поразило: насколько не эффективен путь стэйт-машины, которым идут все, кто обрабатывал строки на других языках. И я также думал: будет время, перепишу условный отжим на стэйт-машину и будет быстрее. И сильно ошибался. Когда формировал строку из мегабайта символов - 1С так подвисал, что я чуть было не начал платформу переустанавливать.
Ну и еще удивился очень близкой аналогии с приемом построения запроса. В той задаче никто не рискнул (а мог бы) предлагать другое решение, чтобы сравнить быстродействие, а здесь это легче.
23. ildarovich 6731 16.05.13 13:22 Сейчас в теме
В обсуждении к статье Составные типы — бесплатный сыр мышеловки производительности ее автор предложил для синтеза длинных строк использовать объект ЗаписьXML в виде функции (в моей интерпретации) наподобие
Функция ДлиннаяСтрокаЧерезЗаписьXML(Длина, Чего = "") Экспорт
	Запись = Новый ЗаписьXML;
	Запись.УстановитьСтроку(); 
	Чего = Лев(Чего + " ", 1);
	Для ё = 0 По Длина - 1 Цикл Запись.ЗаписатьБезОбработки(Чего) КонецЦикла;
	Возврат Запись.Закрыть()
КонецФункции
Она работает еще быстрее (примерно на 12%), чем функция через представление массива, приведенная в статье.
marsohod; +1 Ответить
24. Al-X 20.06.13 12:44 Сейчас в теме
Мда !! Люблю я статьи про исследования 1С. За статью - спасибо ! Но я как-то слабо (точнее никак) представляю, когда может понадобиться обрабатывать строки большей длинны ? Может у меня не так много опыта еще....
25. i_volodin 20.06.13 14:52 Сейчас в теме
(24) Al-X, Ну генерация текста запроса - самый очевидный ответ.
26. sacred 171 28.10.13 13:14 Сейчас в теме
(24) Al-X, А я как-то раз занимался "конвертированием" правил обмена из Конвертации данных в программный код. Строка там получалась зело длинная. Тогда я выкрутился созданием нескольких вложенных циклов, вместо одного линейного. Парадокс. Во внутреннем складывал 20-30 кусочков и полученная строчка уходила на обработку во внешний цикл. Внешний тоже складывал 10-20 уже укрупнённых строк. Ну и самый внешний складывал самые крупные куски. Такая методика сильно ускорила построение текста по сравнению с одним простым циклом.
Однако, сейчас я бы это делал через ЗаписьТекста/ТекстовыйДокумент.
27. ildarovich 6731 28.10.13 13:56 Сейчас в теме
(26) Самый быстрый из проверенных способов - через объект ЗаписьXML. Ссылка в комментарии (23).
29. Sergey.Noskov 17.07.14 15:15 Сейчас в теме
(27) ЗаписьТекста или ТекстовыйДокумент пробовали? Интересно узнать сравнительные замеры. Решал задачу связанную со сложением строк в базе ЦУП, использовал тогда ТекстовыйДокумент.
28. Sergey.Noskov 17.07.14 15:13 Сейчас в теме
(24) Al-X, формирование текстов писем, тестов логов, обмен через текстовые файлы
30. ildarovich 6731 07.01.19 00:45 Сейчас в теме
Вот здесь: https://habr.com/company/1c/blog/429678/ 1С описала свой механизм работы со строками...
Наша строка основана на идеях оптимизации строк, высказанных ещё в начале 2000-х Андреем Александреску
Теперь ступенька на графике получила конкретное объяснение.
Оставьте свое сообщение

См. также

Распаковка хранилища значений средствами MS SQL Server 15

Инструменты и обработки Программист Компонента, плагин (dll, vbs,..) MS SQL Абонемент ($m) Практика программирования

Способ извлечения данных из 1С-ного "ХранилищеЗначений" в MS SQL Server с помощью самописной скалярной функции (без использования платформы 1С).

1 стартмани

23.09.2019    2282    SerVer1C    11       

Расширяем возможности MS SQL Server с помощью хранимых процедур CLR 8

Инструменты и обработки Программист Архив с данными MS SQL Абонемент ($m) Практика программирования Разработка

Не хватает какого-то функционала на скуле для обработки данных? Тогда он (новый функционал) идет к вам.

1 стартмани

02.09.2019    2923    SerVer1C    9       

Упражнения на Перфоленте. Парсим технологический журнал 1С 20

Статья Системный администратор Программист Архив с данными Windows Абонемент ($m) Сервисные утилиты Инструментарий разработчика Практика программирования Разработка

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

1 стартмани

31.07.2019    3101    Perfolenta    62       

В 1000 раз быстрее 12

Статья Программист Архив с данными ИТ-компания Windows Абонемент ($m) Практика программирования Разработка

Реализация алгоритма трассировки лучей на новом языке программирования "Перфолента"

1 стартмани

24.07.2019    2326    vasvl123    6       

Перфолента, первое знакомство. Новый язык программирования 128

Инструменты и обработки Программист Приложение (exe) Windows Абонемент ($m) Практика программирования Инструментарий разработчика Разработка

Первое знакомство с новым языком программирования Перфолента. В статье описано назначение языка, причины его появления, основные характеристики и возможные варианты использования.

22.07.2019    13760    86    Perfolenta    154       

Вам нравятся запросы в 1С? 13

Инструменты и обработки Программист Конфигурация (md, cf) v8 v8::Запросы 1cv8.cf Абонемент ($m) Практика программирования Разработка

Речь не только о том, что простейший запрос с "легальным" оформлением растянется на пол-экрана, речь еще обо всем, что нужно написать "в нагрузку" к тексту запроса. Все эти "Новый Запрос", "УстановитьПараметр" и последующие пляски с обработкой результата... Пора с этим заканчивать!

1 стартмани

03.07.2019    9223    1    m-rv    73       

Безопасная работа с транзакциями во встроенном языке 184

Статья Программист Конфигурация (md, cf) v8 1cv8.cf Абонемент ($m) Практика программирования Разработка

Разбираемся с опасностями использования транзакций во встроенном языке 1С. Познаем ошибку "В данной транзакции уже происходили ошибки". Учимся защищаться от них.

1 стартмани

25.03.2019    13464    7    tormozit    35       

Коннектор: удобный HTTP-клиент для 1С:Предприятие 8 514

Инструменты и обработки Программист Конфигурация (md, cf) v8 1cv8.cf Абонемент ($m) Практика программирования Внешние источники данных WEB Универсальные функции Инструментарий разработчика Универсальные обработки

Коннектор - библиотека для работы с HTTP запросами. Библиотека берет на себя всю рутину работы с HTTP запросами. Буквально в одну строку можно получать данные, отправлять, не заботясь о необходимости конструирования URL, кодирования данных и т.п.

1 стартмани

31.01.2019    25418    245    bonv    108       

Настраиваемое мобильное приложение для сканирования штрихкодов 10

Инструменты и обработки Программист Приложение (apk) Android Абонемент ($m) Практика программирования Сканер штрих-кода Мобильная разработка

Обзор приложения для сканирования штрихкодов с возможностью обработки результата сканирования произвольным кодом для совместного использования с Android приложениями через Intent и взаимодействие с 1С конфигурациями через web-сервис.

1 стартмани

14.01.2019    3642    2    inord777    5       

Разработка внешних компонент на ассемблере goAsm 128

Статья Программист Архив с данными Windows Абонемент ($m) Практика программирования

Создание внешней компоненты по технологии Com "с нуля", используя ассемблер goAsm.

1 стартмани

26.11.2018    7352    6    chessman    40       

Работа с публикациями "Инфостарт" 13

Инструменты и обработки Программист Архив с данными v8 УУ Абонемент ($m) Практика программирования О сообществе WEB

Работа с рублевыми публикациями на сайте "Инфостарт": ведение клиентов, заказов, обновление файлов публикации, рассылка обновлений.

1 стартмани

13.09.2018    8285    10    RocKeR_13    12       

Создаем объекты для модуля Bootstarp на Русском Фоксе 3

Инструменты и обработки Программист Архив с данными Россия Windows Абонемент ($m) Практика программирования

Создавайте свой модуль с объектами для модуля Bootstrap, пакуйте их fxp-файлы и создавайте сайты из этих кубиков. Разберем, как это делать. Все гениальное должно быть простым, как теория относительности.

1 стартмани

19.08.2018    3644    andreosh    2       

РусскийФокс и BootStrap 3

Инструменты и обработки Программист Архив с данными Россия Абонемент ($m) Практика программирования

РусскийФокс вносит новый технологический подход в сайтостроение. Теперь вы можете ограничиться знанием Русского Фокса и не иметь знаний по HTML, CSS, JavaScript, PHP, чтоб создавать сайты.

1 стартмани

16.08.2018    3948    2    andreosh    18       

Позиционирование в помещении с помощью нейросети по сигналу Wi-Fi. Интерактивная карта склада в 1С с показом позиции 63

Инструменты и обработки Программист Бизнес-аналитик Приложение (apk) v8 Windows Абонемент ($m) Инструментарий разработчика Практика программирования

Данная публикация содержит в себе редактор и интерактивную карту склада или иного помещения, на которой в реальном времени отображается позиция устройства, координаты которого вычисляются по уровням сигнала нескольких роутеров Wi-Fi. В статье и приложенным к ней разработкам предлагаются инструменты и методика для реализации вычисления точной геопозиции внутри помещений с помощью нейронной сети. Конфигурация написана на релизе 1С:Предприятие 8.3.12.1412, клиентское приложение имеет минимальный уровень совместимости SDK -16.

5 стартмани

09.08.2018    14833    23    informa1555    26       

РусскийФокс. Изменение DBF-файла и назначение командных клавиш 1

Инструменты и обработки Программист Архив с данными Россия Windows Абонемент ($m) Практика программирования Файловые протоколы обмена, FTP

- Шарапов, ты Русского Фокса знаешь ? - Конечно, Глеб. Я же программирую на Русском Фоксе. РусскийФокс (1C-подобный язык программирования) создает DBF-файлы и выгружает данные из DBF в XML.

1 стартмани

01.08.2018    3848    andreosh    2       

РусскийФокс. Создание DBF-файла, выгрузка в XML. 3

Инструменты и обработки Программист Архив с данными Россия Windows Абонемент ($m) Практика программирования

Новый объектно-ориентированный русскоязычный 1С-подобный язык программирования РусскийФокс. . РусскийФокс создает DBF-файлы и выгружает данные из DBF в XML. Голосуйте за доклад о РусскийФокс на Инфостарт.

1 стартмани

28.07.2018    3498    2    andreosh    0       

РусскийФокс и ClickerMann заносят данные в 1С 5

Инструменты и обработки Программист Архив с данными Россия Windows Абонемент ($m) Сервисные утилиты Практика программирования

Новый объектно-ориентированный русскоязычный 1С-подобный язык программирования РусскийФокс. . РусскийФокс создает сценарии для Clickermann. Сценарий заполняет справочник в 1С.

1 стартмани

21.07.2018    6272    1    andreosh    20       

Работа с данными выбора 38

Инструменты и обработки Программист Архив с данными v8 Россия Абонемент ($m) Практика программирования Работа с интерфейсом

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

1 стартмани

17.07.2018    20022    13    kalyaka    15       

РусскийФокс и OpenOffice, а также исследование объектов 5

Инструменты и обработки Программист Архив с данными Россия Windows Абонемент ($m) Практика программирования

Новый объектно-ориентированный русскоязычный 1С-подобный язык программирования РусскийФокс. . Взаимодействие с OpenOffice. GitHub https://github.com/UfaScript/RusFox

1 стартмани

12.07.2018    3832    1    andreosh    2       

РусскийФокс. Настройка NotePad++, 1C-подобные функции и операторы и создание объектов 11

Статья Программист Архив с данными Россия Windows Абонемент ($m) Практика программирования Математика и алгоритмы

Новый объектно-ориентированный русскоязычный 1С-подобный язык программирования РусскийФокс. Создание объектов и настройка NotePad++. GitHub https://github.com/UfaScript/RusFox

1 стартмани

06.07.2018    7363    1    andreosh    12       

РусскийФокс — 1С-подобный язык программирования 8

Инструменты и обработки Программист Архив с данными Россия Windows Абонемент ($m) Практика программирования Математика и алгоритмы

Новый объектно-ориентированный русскоязычный 1С-подобный язык программирования РусскийФокс. Знакомство.

1 стартмани

03.07.2018    6214    1    andreosh    50       

ВСТАВИТЬ В Справочник.Номенклатура (Код, Наименование) ЗНАЧЕНИЯ ("001", "Новый товар") 105

Инструменты и обработки Программист Внешняя обработка (ert,epf) v8 v8::Запросы 1cv8.cf Абонемент ($m) Практика программирования

Вас не обманывают ваши глаза, это запрос на изменение данных! И это работает без прямого доступа к БД, регистрации и смс.

1 стартмани

01.06.2018    19114    86    m-rv    57       

БСП: Дополнительная обработка (Регламенты), примеры от простого к сложному 236

Статья Программист Внешняя обработка (ert,epf) v8 1cv8.cf Абонемент ($m) Практика программирования БСП (Библиотека стандартных подсистем)

Очень много попадается странных решений, которые можно решить через БСП:Дополнительные отчеты и обработки. Я бы вообще БСП из-за этой подсистемы переименовал в «Большое Спасибо Программистам». Поработаем с подсистемой в части написания регламентных заданий.

1 стартмани

10.05.2018    26421    24    dsdred    34       

Как выполнить отчет на СКД через COM и получить данные отчета? 86

Статья Программист Архив с данными v8 УПП1 Россия Windows Абонемент ($m) Практика программирования

Для чего это нужно. Например, нужно в одной базе получить какой-либо показатель из другой базы. Этот показатель вычисляется в каком-либо сложном отчете, который написан на СКД. Можно, конечно, "скопипастить" текст запроса из другой базы, немного подправить его и выполнять в том же COM подключении. Но с этим теряется гибкость: если отчет изменился, то нужно помнить о том, что где-то есть его "немного модифицированная" копия. В статье будет рассмотрен пример получения данных из базы ЗУП.

2 стартмани

08.05.2018    17320    10    wowik    3       

Работа со схемой запроса 171

Статья Программист Конфигурация (md, cf) v8 v8::Запросы Абонемент ($m) Инструментарий разработчика Практика программирования

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

1 стартмани

24.04.2018    27352    72    kalyaka    34       

Длинная арифметика (Bignum arithmetic) c COM-интерфейсом (ActiveX) на библиотеках MPIR 4

Инструменты и обработки Программист Архив с данными Россия Windows Абонемент ($m) Инструментарий разработчика Практика программирования

Расчеты любой точности в вашем программном продукте, поддерживающем стандарт COM. Размер/точность длинного числа зависит только от вашей оперативной памяти. Проект основан на исходниках библиотеки MPIR, Edition 3.0.0. Полностью написан на С/С++ (COM.DLL).

1 стартмани

12.04.2018    3676    1    bedvit    4       

Заполняем по шаблону (по умолчанию) 68

Инструменты и обработки Программист Архив с данными v8 v8::УФ 1cv8.cf Абонемент ($m) Практика программирования

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

1 стартмани

08.02.2018    17488    20    mvxyz    17       

Бесплатная проверка контрагентов в ФНС (общий модуль с алгоритмом). На примере выводим статус в список справочника контрагентов 122

Статья Программист Конфигурация (md, cf) v8 1cv8.cf Абонемент ($m) Практика программирования

Если вам интересно проверить контрагенте в ФНС, вам поможет данная публикация. Весь алгоритм работы строится на основе данных, полученных с сервиса http://npchk.nalog.ru совершенно бесплатно.

1 стартмани

01.02.2018    24367    61    rpgshnik    46       

Программное создание динамического списка на управляемой форме. (Динамическое создание динамического списка). Готовая процедура + обработка - демонстрационный пример 269

Статья Программист Внешняя обработка (ert,epf) v8::УФ 1cv8.cf Абонемент ($m) Практика программирования Универсальные функции

Если у вас возникает необходимость на форму влиять динамически и создавать элементы управляемой формы программно, а особенно хотите вывести программно (динамически) динамический список, вам будет интересна эта процедура. Процедура включает также возможность формирования своей командной панели (а-ля снятие галочки "Автозаполнение" у стандартной командной панели списка).

1 стартмани

19.01.2018    38012    55    rpgshnik    26       

Расширение возможностей печати: Вывод произвольного нижнего и верхнего колонтитула 8

Отчеты и формы Программист Внешняя обработка (ert,epf) v8 1cv8.cf Абонемент ($m) Печатные формы документов Практика программирования Универсальные функции

Расширяем функционал вывода нижнего / верхнего колонтитула. Стандартно 1С имеет достаточно ограничений по выводу и наполнению колонтитулов содержимым, взять хотя бы такие, как вывод только текста и отсутствие ограничения на номер конечной страницы. А при разработке кода сталкиваешься с тем, что свой блок с нижним колонтитулом нужно прижимать к низу страницы. Казалось бы быстро решаемый вопрос, но и в нем есть нюансы. Сейчас я расскажу о том, как решалась эта задача. UPD 15.02.2018. Добавлен вывод верхнего колонтитула; Вывод колонтитулов на первой и последней странице управляется параметрами; Научился считать страницы: Добавлено заполнение переменных аналогичных стандартным из колонтитулов; Задаются форматы даты и времени. Ограничения прежние: 1. Повторно сформировать табличный документ после смены параметров страницы интерактивно.; 2. Передавать данные для более плотной печати как можно более мелко нарезанными кусками.

1 стартмани

29.12.2017    21546    21    agent00mouse    0       

Веб-разработка на 1С (1Script) 140

Инструменты и обработки Программист Архив с данными Абонемент ($m) Практика программирования

Дорогие коллеги, под новый год хочется сделать небольшой сюрприз. Я уже два года обещаю сделать движок веб-разработки для 1С-ников, и вот, наконец, есть что показать. Этим новогодним постом я открываю сериал "Веб-разработка для 1С-ников". Все, кто знаком с проектом OneScript – добро пожаловать! Остальные, тоже не стесняйтесь!

1 стартмани

28.12.2017    24546    21    Evil Beaver    81       

Печатная форма, сделанная как расширение конфигурации для БП 3.0. Новые возможности БСП 26

Инструменты и обработки Программист Расширение (cfe) v8 БП3.0 Абонемент ($m) Практика программирования Универсальные печатные формы

Печатные формы на внешних обработках скоро канут в лету. На смену им приходят ПФ, реализованные в виде расширений конфигурации. Не нашел на сайте примеров таких расширений. Привожу пример подобного расширения для БП 3.0.

1 стартмани

06.12.2017    17925    52    kwazi    6       

Программа для изменения осей движения мыши - IMouse 4

Инструменты и обработки no Архив с данными Россия Windows Абонемент ($m) Практика программирования

Программа предназначена для изменения движения курсора мыши.

1 стартмани

10.08.2017    8838    1    GubinDenis    12       

Правила и приемы доработки типовых конфигураций 1С для облегчения их дальнейшей поддержки и обновления 147

Статья Программист Архив с данными Абонемент ($m) Практика программирования

В первую очередь, статья адресована разработчикам 1С, но надеюсь, что интересно будет не только им.

1 стартмани

18.07.2017    27792    786    Tavalik    58       

Расширения конфигураций 1С: учимся перехватывать методы 110

Инструменты и обработки Программист Расширение (cfe) v8 v8::УФ 1cv8.cf Абонемент ($m) Практика программирования

В этой статье я на примерах разберу некоторые механизмы расширений конфигураций 1С. А именно «перехваты» методов модуля объекта и «перехваты» событий формы и элементов формы. Данная статья написана с учебными целями, чтобы показать, как при помощи расширений конфигурации можно делать такие доработки, ради которых раньше приходилось снимать конфигурацию с поддержки.

1 стартмани

30.05.2017    82303    14    signum2009    45       

Многопоточность. Универсальный «Менеджер потоков» (фреймворк) с отслеживанием зависимости объектов 176

Статья Программист Архив с данными v8 1cv8.cf Россия Абонемент ($m) Практика программирования Математика и алгоритмы Универсальные функции Производительность и оптимизация (HighLoad)

Восстановление партий, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

26.05.2017    38499    168    DarkAn    86       

СКД. Использование встроенного макета, разделителя страниц 2

Инструменты и обработки Программист Внешний отчет (ert,erf) v8::СКД 1cv8.cf Windows Абонемент ($m) Практика программирования

Пример работы с макетом СКД для начинающих программистов. За основу взят справочник подразделений, который есть в большинстве конфигураций. Показано, как вывести заголовок, детальные записи, подвал группировки и общий подвал. Приведен пример вставки разделителя страниц. Отчет можно использовать в любой конфигурации 1С: 8.

1 стартмани

31.03.2017    10602    14    Vin_Tik    0       

Простой способ индексирования интервалов 181

Статья Программист Конфигурация (md, cf) v8 Абонемент ($m) Практика программирования

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

1 стартмани

28.09.2016    31706    39    ildarovich    22       

1С: Предприятие + корпоративный чат, как наладить оперативные уведомления за 10 минут 61

Инструменты и обработки Системный администратор Программист Компонента, плагин (dll, vbs,..) v8 Windows Абонемент ($m) Практика программирования

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

1 стартмани

14.08.2016    38192    35    Demanoidos    60       

Программа "Назад в прошлое" 4

Инструменты и обработки no Приложение (exe) Windows Абонемент ($m) Практика программирования

На панельке винды появляется человечек, которым можно управлять: бегать туда-сюда, прыгать, стрелять.

1 стартмани

24.06.2016    9366    3    fierylions    1       

Хранение файлов в томах на диске (для УПП 1.3) 76

Инструменты и обработки Программист Архив с данными v8 УПП1 Windows Абонемент ($m) Практика программирования

Доработка типовой УПП 1.3 в плане хранения присоединенных файлов вне базы данных

2 стартмани

05.06.2016    43616    4    wowik    27       

Остатки на каждый день в запросе 34

Инструменты и обработки Программист Внешняя обработка (ert,epf) v8 1cv8.cf УУ Windows Учет ТМЦ Абонемент ($m) Практика программирования

Запрос формирует остатки товаров на каждый день в пределах выбранного периода.

1 стартмани

26.04.2016    34111    19    arakelyan    17       

Выполнение JavaScript кода из 1С в объекте Поле HTML Документа (HTML 5) и вызов события в 1С ПриНажатии 150

Инструменты и обработки Программист Внешняя обработка (ert,epf) v8 1cv8.cf Россия Windows Абонемент ($m) Практика программирования

Пример выполнения JS кода из 1С в Поле HTML Документа под управляемыми формами, с удобным получением результата в 1С(С помощью вызова привязанного события ПриНажатии к элементу ПолеHTMLДокумента)

1 стартмани

22.03.2016    60324    135    igo1    49       

Количество дней недели (понедельников/вторников/...) в заданном диапазоне одним запросом 29

Инструменты и обработки Программист Внешняя обработка (ert,epf) v8 Абонемент ($m) Практика программирования

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

1 стартмани

03.03.2016    12059    1    Alexander.Shvets    5       

Групповое изменение изображений (размер, ориентация и переименование) 1

Инструменты и обработки no Архив с данными Windows Абонемент ($m) Практика программирования

Программа для группового изменения размера, ориентации изображений

1 стартмани

24.02.2016    6313    5    infoprograms    2       

Простые радости жизни программиста 1С: выбор типа значения 51

Инструменты и обработки Программист Внешняя обработка (ert,epf) v8 1cv8.cf Абонемент ($m) Практика программирования Работа с интерфейсом

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

1 стартмани

17.02.2016    38607    45    yuraos    17       

Яндекс.Деньги "Благотворительность" 17

Инструменты и обработки Программист Внешняя обработка (ert,epf) v8 1cv8.cf Windows Абонемент ($m) Инструментарий разработчика Практика программирования

Яндекс.Деньги теперь в 1С. Форма для приема благотворительных взносов. Форму легко сделать и вставить на любую страницу сайта или блога. Платежи будут приходить на ваш кошелек. На форме есть три способа платежа: из кошелька, с банковской карты, с баланса мобильного.

1 стартмани

16.02.2016    17255    9    Tatitutu    5       

Удобная база знаний для программиста 1С. "Шаблоны текста" в WEB-е 22

Инструменты и обработки Системный администратор Программист Архив с данными Абонемент ($m) Инструментарий разработчика Практика программирования

Справочник для программиста 1С. (WEB) Легко и быстро вести "дневник" программиста. Одним кликом редактировать статьи, примеры кода. Сохранять обработки и добавлять к ним описания.

1 стартмани

28.01.2016    13170    26    Farzar    15       

Мастер рассылки e-mail 2.2 для управляемых форм 9

Инструменты и обработки Программист Внешняя обработка (ert,epf) v8 v8::УФ ERP2 БП3.0 УТ11 Абонемент ($m) Практика программирования Email

Для пользователей: переделанный из старый разработки под 8.2 с использованием библиотеки Мастер рассылки e-mail 2.2 (ERP, УТ, БП) (Только управляемые формы), который теперь может запускаться под любой версией платформы с разрешенными или запрещенными модальными/синхронными вызовами в конфигурации. Также удобный выбор e-mail и их владельцев с помощью отбора динамического списка по любым критериям и галочки исключения.

1 стартмани

29.12.2015    30490    20    milkers    4