Табличная часть как поле ввода

20.09.21

Разработка - Инструментарий разработчика

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

Все

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Табличная часть как поле ввода:
.cf 160,04Kb
3
3 Скачать (1 SM) Купить за 1 850 руб.

Unlicense

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Табличная часть как поле ввода:
.dt 117,95Kb
6
6 Скачать (1 SM) Купить за 1 850 руб.

Табличные части существуют у большинства объектов в 1С:

  • Справочники
  • Документы
  • Отчеты и обработки
  • Планы счетов
  • Планы видов характеристик
  • Планы видов расчета
  • Бизнес-процессы и задачи

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

Для отображения табличной части на форме существует только одна сущность "таблица" и этот объект не всегда удобен для отображения некоторых видов данных, например таких как телефоны, email адреса и т.д. 

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

Моя реализация не привязана к конкретному объекту, располагается в общем модуле и встраивается в любую форму, количество строк кода  для реализации базового функционала, составляет  от 12 строк без учета комментариев.

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

 

 

Внутри группы строки количество элементов и вложенных групп не ограничено.  

У поля ввода внутри группы строки устанавливаем ПутьКДанным как ссылку на необходимые данные в нулевой строке табличной части.

 

 

Добавляем на форму команды Добавить и Удалить

 

 

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

Так как изменять форму можно только в контексте Сервера, делаем процедуру обертку на Сервере

// ***********************************************************************************************
// Вариант с ограничением количества строк таблицы 10-тью
// *********************************************************************************************** 
&НаСервере
Процедура EmailДобавитьНаСервере()       
    TableAsInputField.ДобавитьСтроку(ЭтаФорма, Объект.Email, Элементы.ГруппаEmail, 10);
КонецПроцедуры // EmailДобавитьНаСервере() 
&НаКлиенте
Процедура EmailДобавить(Команда)       
    EmailДобавитьНаСервере();
КонецПроцедуры // EmailДобавить() 



// ***********************************************************************************************
// Вариант без ограничения
// *********************************************************************************************** 
&НаСервере
Процедура EmailДобавитьНаСервере()       
    TableAsInputField.ДобавитьСтроку(ЭтаФорма, Объект.Email, Элементы.ГруппаEmail);
КонецПроцедуры // EmailДобавитьНаСервере() 
&НаКлиенте
Процедура EmailДобавить(Команда)       
    EmailДобавитьНаСервере();
КонецПроцедуры // EmailДобавить() 

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

Процедура УдалитьСтроку асинхронная и доступна только в контексте клиента, это сделано для поддержки ВебКлиента.

// ***********************************************************************************************
// Вариант без подтверждения
// ***********************************************************************************************
&НаКлиенте                      
Процедура EmailУдалить(Команда)  
    TableAsInputField.УдалитьСтроку(ЭтаФорма, Объект.Email, Элементы.ГруппаEmail);    
КонецПроцедуры // EmailУдалить() 



// ***********************************************************************************************
// Вариант с подтверждением
// ***********************************************************************************************
&НаКлиенте                      
Процедура EmailУдалить(Команда)  
    TableAsInputField.УдалитьСтроку(ЭтаФорма, Объект.Email, Элементы.ГруппаEmail, Истина, "Вы уверены?"););    
КонецПроцедуры // EmailУдалить() 

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

// ***********************************************************************************************
// ***********************************************************************************************
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)  
	TableAsInputField.ВывестиСтрокиТаблицыИсточника(ЭтаФорма, Объект.Email, Элементы.ГруппаEmail);
КонецПроцедуры // ПриСозданииНаСервере()

На этом все, реализация табличной части как поля ввода закончена.

В заключение привожу полный листинг общего модуля TableAsInputField

 

И полный листинг модуля формы элемента справочника "Контакты".

 

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

Из комментариев сообщества, стало понятно, что в 1С стойкое не приятие английского синтаксиса, поэтому перевёл весь код на русский язык, кроме названий самих общих модулей TableAsInputFiled и Misc, они остались на английском языке, для исключения конфликта с БСП.

 

Проверено на 1С:Предприятие 8.3 (8.3.19.1229).

Изначально разрабатывалось в конфигурации с режимом совместимости 8.3.16.

Также проверена работа в ВебКлиенте.

 

Эту часть публикации можно считать не актуальной:

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

ТабличнаяЧасть как поле ввода Таблица

См. также

SALE! 15%

Инструментарий разработчика Роли и права Запросы СКД Программист Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    159416    872    399    

861

SALE! 15%

Инструментарий разработчика Чистка данных Свертка базы Инструменты администратора БД Системный администратор Программист Руководитель проекта Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 10 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 Россия Платные (руб)

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP и т.д.). Поддерживаются управляемые и обычные формы. Может выполнять свертку сразу нескольких баз данных и выполнять их автоматически без непосредственного участия пользователя.

8400 7140 руб.

20.08.2024    7769    55    22    

66

Инструментарий разработчика Программист Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

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

9360 руб.

17.05.2024    23433    68    45    

117

SALE! 15%

Инструменты администратора БД Инструментарий разработчика Роли и права Программист Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

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

10000 8500 руб.

10.11.2023    10417    36    21    

61

SALE! 15%

Пакетная печать Печатные формы Инструментарий разработчика Программист Платформа 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:Конвертация данных 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

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

22200 19980 руб.

06.10.2023    15398    35    7    

70

SALE! 35%

Инструментарий разработчика Инструменты администратора БД Системный администратор Программист Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

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

4800 3120 руб.

14.01.2013    187976    1138    0    

912

SALE! 15%

Инструментарий разработчика Программист 8.3.14 1С:Конвертация данных Россия Платные (руб)

Расширение для конфигурации “Конвертация данных 3”. Добавляет подсветку синтаксиса, детальную контекстную подсказку, глобальный поиск по коду.

15000 12750 руб.

07.10.2021    17303    6    32    

42

Инструментарий разработчика Программист Платные (руб)

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

1800 руб.

21.02.2023    7694    8    35    

23
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Steelvan 306 20.09.21 11:20 Сейчас в теме
Никто не спрашивает, почему вы используете вражеский, на это у каждого своя причина и свои тараканы.

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

А что, тоже латиница. И замечательно работает.

Надо было еще и украинского насыпать для всей красоты картины :)
user1917552; Bosma; Somebody1; frkbvfnjh; Award; DrAku1a; Evg-Lylyk; Merkalov; json; rpgshnik; dajen; sinichenko_alex; cleaner_it; klaus38; +14 Ответить
2. harchenko_pavel 41 20.09.21 11:36 Сейчас в теме
(1)Программист не знающий английский так себе программист ИМХО. Если вы обратили внимание, то для названия переменных я использую кириллицу, так что причин для затруднений в сопровождении не вижу. В любом случае вас ни кто не заставляет интегрировать мой код.
So, it's up to you which language to use))
panvartan; Nigmatul; +2 1 Ответить
88. Поручик 4692 06.10.21 15:53 Сейчас в теме
(1) А вот я ещё итальянский знаю. Кстати, украинский здесь видел в какой-то обработине или коде.
3. tindir 20.09.21 11:45 Сейчас в теме
Бедные Цетраэль, Алт и Шифт стерты видимо до состояния протертости на столе.
Поручик; DrAku1a; rpgshnik; +3 Ответить
4. harchenko_pavel 41 20.09.21 12:21 Сейчас в теме
(3) Только Цетраэль и Шифт ))))
5. ixijixi 1913 20.09.21 12:37 Сейчас в теме
Помимо того, что Procedure ЗаполнитьКоллекциюСвойств(DesCollection, SrcCollection) - это малочитабельно, такой функционал есть в БСП.
DrAku1a; 0x00; rpgshnik; +3 Ответить
6. harchenko_pavel 41 20.09.21 13:22 Сейчас в теме
(5)Моя реализация легковесная и для интеграции требует только один общий модуль. Я специально не использую БСП, так как есть кастомные конфигурации без БСП, а интегрировать БСП ради пары функций это огромный оверхед.

Кроме того Procedure ЗаполнитьКоллекциюСвойств(DesCollection, SrcCollection) не экспортная, она инкапусулирована внутри моего общего модуля и не доступна вне его, она раз написана и не предусматривает правок.

И что вас собственно смущает? DesCollection и SrcCollection? Если да, то src и des это общепринятые сокращения для Источника и Приемника/Получателя/Адресанта, для меня это легче читаемо чем ИстКоллекция и ПриемКоллекция.

Если честно то меня вообще ставят в тупик комментарии сообщества 1С, кроме не обоснованной критики, ничего по существу. На вопросы на форуме как правило половина ответов это издевки над начинающими программистами, есть тема где какой-то студент просит помощи в самостоятельной работе, в итоге 20 комментариев стеба и один ответ по существу, так и то после ответа возмущения от сообщества "Зачем ты ему подсказал, тема обещала быть эпической".
Почитайте иностранные сообщества по другим языкам программирования, C++, C#, Java, Python и т.д., участники сообществ всегда готовы помочь, дают рабочие примеры кода, указывают ошибки и объясняют их. А не как здесь, "почитай для начала Хрусталеву", "неправильно то, что сначала надо понять, что такое реляционная база данных, что такое ссылка, как устроены связи объектов в базе, откуда берутся данные для отчетов и почему именно так, а потом начинать программировать" и т.д..

И вообще, я же не заставляю вас интегрировать мой код, не нравится или не нужен, не используйте.
Три комментария и кроме упрека в использовании английского языка и отказа интеграции такого монстра как БСП ради пары процедур, ни чего по существу.
Знание английского языка это что недостаток? Наоборот, английский язык к вашему сведению повышает ваши биды на фрилансе и апворке в разы.
Obertone; user1304317; BullTi; dajen; TreeDogNight; +5 Ответить
8. ixijixi 1913 20.09.21 14:20 Сейчас в теме
(6) Ну, я плюс-то поставил, если что) Но каша из языков реально напрягает
cleaner_it; +1 Ответить
53. PlatonStepan 38 23.09.21 15:27 Сейчас в теме
DesCollection и SrcCollection? Если да, то src и des это общепринятые сокращения для Источника и Приемника/Получателя/Адресанта, для меня это легче читаемо чем ИстКоллекция и ПриемКоллекция


src, dst имхо общепринятые или source/destination.

ИстКоллекция и ПриемКоллекция также не читабельны
7. noprogrammer 239 20.09.21 14:13 Сейчас в теме
Сама разработка хорошая (как вариант использования - мобильное приложение), поэтому "+" однозначно, но вот использование 2х языков тоже считаю не уважением и дело тут не в том, что кто-то не знает анг. (скорее всего в той или иной форме знают все) а в том, что читать код на 2х языках то еще удовольствие...99% тех кто будет заимствовать данный код (я не исключение) будет переводить его на русский язык (ибо в 99% весь код написан на русском языке)
rpgshnik; cleaner_it; RustIG; +3 Ответить
9. harchenko_pavel 41 20.09.21 14:26 Сейчас в теме
(7)А мне наоборот после С, С++, С# и Java русский язык в коде глаза режет)))
Дело в том что как я уже писал ранее, я не пишу на 1С, моя специализация программирование ARM MCU (С, С++) и иногда пишу клиентскую часть на С# и С++.
1С это так разовый проект под собственные нужды, соответственно и реализация под себя, просто такая же задача на С++ или С# заняла бы на порядок больше времени, поэтому и пал выбор на 1С
Единственное, чего не хватает в 1С, это ООП, и отсутствие возможности передать в асинхронную процедуру/функцию объекта/переменной по ссылке, а не только по значению, и отсутствие функций Форма.ОткрытьАсинх() или ОткрытьФормуАсинх() рождает лишний оверхед.
Так же не удобно что Форму, полученную из функции ПолучитьФорму(), нельзя передать как аргумент в ОткрытьФорму(), в итоге надо упаковывать параметры в структуры и получать их на форме при создании на сервере.
А как бы было удобно:
Форма = ПолучитьФорму("ОбщаФорма.КакаяТоФорма",,  ЭтотОбъект);
Форма.Реквизит = <какое-то значение>;
Результат = Ждать Форма.ОткрытьАсинх();


Но так к сожалению нельзя, упаковывай параметры, распаковывай их, создавай ОписаниеОповещения, обрабатывай результат в Оповещении, эх сколько оверхеда ((
Obertone; +1 Ответить
10. noprogrammer 239 20.09.21 14:47 Сейчас в теме
(9)
Так же не удобно что Форму, полученную из функции ПолучитьФорму(), нельзя передать как аргумент в ОткрытьФорму()

В "ОткрытьФорму" всегда моно можно передать форму владелец (либо я не правильно понял, что требуется)
11. harchenko_pavel 41 20.09.21 15:51 Сейчас в теме
(10)Я имел ввиду, что в случае применения модальности, после того как форма получена при помощи ПолучитьФорму(), вам доступны к записи ее реквизиты, но на ВебКлиенте модальность не доступна и нужно использовать процедуру ОткрытьФорму(), при этом реквизиты формы не доступны, и их нужно передавать как Параметры, последние нужно обрабатывать в открываемой форме при создании на сервере, а результат который возвращает форма, будет доступен только в Оповещении, переданный в процедуру ОткрытьФорму().

Кстати, вот этот код откроет форму, но реквизиты заполнены не будут((
Форма = ПолучитьФорму("ОбщаФорма.КакаяТоФорма",,  ЭтаФорма);
Форма.ИмяРеквизита  = <какое-то значение>;
Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияФормы", ЭтаФорма);
ОткрытьФорму(Форма ,, ЭтаФорма,,,, Оповещение);

Процедура ПослеЗакрытияФормы(Результат, Параметры)
   // Ваш обработчик
КонецПроцедуры
Показать


Без модальности передать реквизит можно только через параметры, в модуле формы из которой открываем подчиненную
ПараметрыФормы = Новый Структура("ИмяРеквизита ",   <какое-то значение>);
Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияФормы", ЭтотОбъект);
ОткрытьФорму("ОбщаФорма.КакаяТоФорма", ПараметрыФормы, ЭтаФорма,,,, Оповещение);

Процедура ПослеЗакрытияФормы(Результат, Параметры)
   // Ваш обработчик
КонецПроцедуры
Показать


В модуле подчиненной формы, я использую универсальный алгоритм, который записывает параметры в одноименные реквизиты формы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	// ============================================================­============== 
	// Установка реквизитов формы из значений переданных как параметры формы
	Для Каждого Реквизит Из ЭтотОбъект.ПолучитьРеквизиты() Цикл
		Если Параметры.Свойство(Реквизит.Имя) Тогда
			Выполнить(Реквизит.Имя + " = Параметры." + Реквизит.Имя); 
		КонецЕсли;
	КонецЦикла;
    // ============================================================­============== 
КонецПроцедуры // ПриСозданииНаСервере()
Показать


Но это все оверхед, минимум 16-ть строчек кода вместо 3-х, и если бы можно было сделать так, то было бы в разы удобней и понятней
Форма = ПолучитьФорму("ОбщаФорма.КакаяТоФорма",,  ЭтотОбъект);
Форма.Реквизит = <какое-то значение>;
Результат = Ждать Форма.ОткрытьАсинх();
Obertone; TreeDogNight; +2 Ответить
31. noprogrammer 239 20.09.21 22:57 Сейчас в теме
(11) У параметров формы есть свойство "ЗначенияЗаполнения"
ЗначенияЗаполнения=Новый Структура;
ЗначенияЗаполнения("ИмяРеквизита", ЗначениеРеквизита);

ПараметрыФормы=Новый Структура;
ПараметрыФормы.Вставить("ЗначенияЗаполнения", ЗначенияЗаполнения);
	
ОткрытьФорму("ПутьКФорме", ПараметрыФормы);
Obertone; litonchik; TreeDogNight; harchenko_pavel; +4 Ответить
32. harchenko_pavel 41 20.09.21 23:21 Сейчас в теме
12. harchenko_pavel 41 20.09.21 16:25 Сейчас в теме
Так как 1С сообщество против английского языка, вот листинг общего модуля TableAsInputFiled полностью на русском
// ***********************************************************************************************
// Возвращает индекс элемента формы, заданный при помощи спецзнака "_", без спецзнака вернет 0 
//
// Пример: ПолучитьИндексПоИмени("Телефон_1") вернет 1   
//         ПолучитьИндексПоИмени("Телефон_0") вернет 0
//         ПолучитьИндексПоИмени("Телефон")   вернет 0
// ***********************************************************************************************
Функция ПолучитьИндексПоИмени(Знач Имя) Экспорт
	ИмяДлина = СтрДлина(Имя);
	ПозицияСпецСимвола = СтрНайти(Имя, "_", НаправлениеПоиска.СКонца);
	Попытка    Возврат Цел(Прав(Имя, ИмяДлина - ПозицияСпецСимвола));
	Исключение Возврат 0;
	КонецПопытки;
КонецФункции // ПолучитьИндексПоИмени()

// ***********************************************************************************************
// Возвращает ссылку на элемент формы, заданный при помощи спецзнака "_" или без для 0 индекса
//
// Пример: ПолучитьЭлементПоИндексу(ЭтаФорма, 1, "Телефон") вернет ссылку на Элементы.Телефон_1  
//         ПолучитьЭлементПоИндексу(ЭтаФорма, ,  "Телефон") вернет ссылку на Элементы.Телефон 
//
//         ПолучитьЭлементПоИндексу(ЭтаФорма, 0, "Телефон") вернет ссылку на Элементы.Телефон_0, 
//         если Элементы.Телефон_0 не найден вернет ссылку на Элементы.Телефон 
// ***********************************************************************************************  
Функция ПолучитьЭлементПоИндексу(Форма, Индекс = Неопределено, ШаблонИмени) Экспорт
	Элемент = Форма.Элементы.Найти(ШаблонИмени + ?(Индекс = Неопределено, "", "_" + Индекс));
	Если Элемент = Неопределено И Индекс = 0 Тогда 
		Элемент = Форма.Элементы.Найти(ШаблонИмени);
	КонецЕсли;
	Возврат Элемент; 
КонецФункции // ПолучитьЭлементПоИндексу()    

// ***********************************************************************************************
// Ищет в группе команды соответствующие шаблону и устанавливает у них параметр видимость
//
// Пример: НайтиКомандуПоШаблонуИУстановитьВидимость(Форма.Элементы.ГруппаEmail, "Удалить", Ложь)
// ***********************************************************************************************  
Процедура НайтиКомандуПоШаблонуИУстановитьВидимость(ГруппаПоиска, ШаблонПоиска, Состояние) Экспорт 
	Для Каждого Элемент Из ГруппаПоиска.ПодчиненныеЭлементы Цикл   
		Если    ТипЗнч(Элемент) = Тип("КнопкаФормы") И СтрНайти(Элемент.Имя, ШаблонПоиска) <> 0 Тогда
			Элемент.Доступность = Состояние; 
		ИначеЕсли ТипЗнч(Элемент) = Тип("ГруппаФормы") Тогда
			НайтиКомандуПоШаблонуИУстановитьВидимость(Элемент, ШаблонПоиска, Состояние);
		ИначеЕсли ТипЗнч(Элемент) = Тип("ПолеФормы") Тогда 
			НайтиКомандуПоШаблонуИУстановитьВидимость(Элемент.КонтекстноеМеню, ШаблонПоиска, Состояние)
		КонецЕсли;	
	КонецЦикла;                                                                     
КонецПроцедуры // НайтиКомандуПоШаблонуИУстановитьВидимость()

// ***********************************************************************************************
// Добавляет строку в таблицу и настраивает видимость элементов, возвращает ссылку на строку 
//
// Пример: ДобавитьСтроку(ЭтаФорма, Объект.Телефоны, Элементы.ГруппаТелефон, 10)
// ***********************************************************************************************
Функция ДобавитьСтроку(Форма, ТаблицаИсточникДанных, ГруппаИсточник, МаксКоличествоСтрок = Неопределено, СкрытьЗаголовок = Истина) Экспорт  
	Строка = Неопределено;
	Если ТаблицаИсточникДанных.Количество() <> МаксКоличествоСтрок Тогда    
		// Определяем текущую строку и индекс группы
		Строка  = ТаблицаИсточникДанных.Добавить();
		Индекс  = ТаблицаИсточникДанных.Количество() - 1; 
		// Устанавливаем видимость группы
		ГруппаКопии = TableAsInputField.ПолучитьЭлементПоИндексу(Форма, Индекс, ГруппаИсточник.Имя);   
		Если ГруппаКопии <> Неопределено Тогда 
			ГруппаКопии.Видимость = Истина; 
		Иначе 
			ГруппаКопии = СкопироватьЭлемент(Форма, ГруппаИсточник, Индекс, СкрытьЗаголовок);
			#Если Не Сервер Тогда
			ВызватьИсключение("Создавать элементы формы можно только в серверной процедуре!" + Символы.ПС + ОписаниеОшибки());
			#КонецЕсли
		КонецЕсли; 
		// Устанавливаем доступность команды "удалить"  
		НайтиКомандуПоШаблонуИУстановитьВидимость(ГруппаКопии, "Удалить", Истина);  
		Форма.Модифицированность = Истина;
	КонецЕсли;
	Возврат Строка; 
КонецФункции // ДобавитьСтроку()  

// ***********************************************************************************************
// Удаляет строку из таблицы и настраивает видимость элементов   
//
// Пример: УдалитьСтроку(ЭтаФорма, Объект.Телефоны, Элементы.ГруппаТелефон, Истина, "Уверены?")
//         УдалитьСтроку(ЭтаФорма, Объект.Телефоны, Элементы.ГруппаТелефон)
// *********************************************************************************************** 
&НаКлиенте
Асинх Процедура УдалитьСтроку(Форма, ТаблицаИсточникДанных, ГруппаИсточник, ЗадатьВопрос = Ложь, Вопрос = Неопределено) Экспорт
	Строка  = ТаблицаИсточникДанных[TableAsInputField.ПолучитьИндексПоИмени(Форма.ТекущийЭлемент.Имя)];
	Индекс  = ТаблицаИсточникДанных.Количество() - 1; 
	Вопрос = ?(Вопрос = Неопределено, "Удалить текущую запись?", Вопрос);
	Подтверждено = ?(ЗадатьВопрос = Истина, 
	               Ждать ВопросАсинх(Вопрос, РежимДиалогаВопрос.ДаНет, 0, КодВозвратаДиалога.Нет),
				   КодВозвратаДиалога.Да);
	Если Подтверждено = КодВозвратаДиалога.Да Тогда
		// Удаляем текущую строку
		ТаблицаИсточникДанных.Удалить(Строка);   
		// Устанавливаем видимость группы
		ГруппаКопии = TableAsInputField.ПолучитьЭлементПоИндексу(Форма, Индекс, ГруппаИсточник.Имя);   
		Если ГруппаКопии <> Неопределено И ТаблицаИсточникДанных.Количество() <> 0 Тогда 
			ГруппаКопии.Видимость = Ложь;  
		КонецЕсли;    
		// На ВебКлиенте при скрытии элементов формы, поля не обновляются, 
		// поэтому получаем группу для их принудительного обновления
		#Если ВебКлиент Тогда 
		ГруппаРодитель = Форма.Элементы.Найти(ГруппаИсточник.Родитель.Имя); 
		#КонецЕсли
	    // Устанавливаем доступность команды "удалить"  
		НайтиКомандуПоШаблонуИУстановитьВидимость(ГруппаКопии, "Удалить", Ложь); 
		Форма.Модифицированность = Истина; 
		// Если ВебКлиент, обновляем все элементы группы родителя принудительно		
		#Если ВебКлиент Тогда 
		Форма.ОбновитьОтображениеДанных(ГруппаРодитель); 
		#КонецЕсли
	КонецЕсли;
КонецПроцедуры // УдалитьСтроку() 

// ***********************************************************************************************
// Устанавливает видимость групп для вывода талицы как отдельных полей ввода строк 
// *Если поле не найдено, создает его программно
//
// Пример: ВывестиСтрокиТаблицыИсточника(ЭтаФорма, Объект.Телефоны, Элементы.ГруппаТелефон)
// ***********************************************************************************************  
Процедура ВывестиСтрокиТаблицыИсточника(Форма, ТаблицаИсточникДанных, ГруппаИсточник, СкрытьЗаголовок = Истина) Экспорт 	
#Если Сервер Тогда
	// Обходим все элементы таблицы источника данных
	Для Индекс = 0 To ТаблицаИсточникДанных.Количество() - 1 Цикл    
		// Устанавливаем видимость группы
		ГруппаКопии = TableAsInputField.ПолучитьЭлементПоИндексу(Форма, Индекс, ГруппаИсточник.Имя);   
		Если ГруппаКопии <> Неопределено Тогда 
			ГруппаКопии.Видимость = ГруппаИсточник.Видимость; 
		Иначе                                
			ГруппаКопии = СкопироватьЭлемент(Форма, ГруппаИсточник, Индекс, СкрытьЗаголовок);
		КонецЕсли;
		// Устанавливаем доступность команды "удалить"  
		НайтиКомандуПоШаблонуИУстановитьВидимость(ГруппаКопии, "Удалить", Истина); 
	КонецЦикла;
#Иначе
	ВызватьИсключение("Функция ВывестиСтрокиТаблицыИсточника может быть вызвана только в серверной процедуре!
	      |Например, внутри процедуры ПриСозданииНаСервере()" + Символы.ПС + ОписаниеОшибки());
#КонецЕсли  
КонецПроцедуры // ВывестиСтрокиТаблицыИсточника()  

// *********************************************************************************************** 
// Процедура создает копию элемента формы
//
// Форма           - Форма источник
// Источник        - элемент который копируется       
// Группа      	   - необязательный параметр, группа куда будет вставлен скопированный элемент  
// Индекс          - индекс строки в пути к данным поля ввода
// СкрытьЗаголовок - если значение Истина, заголовок будет скрыт   
// ***********************************************************************************************
Функция СкопироватьЭлемент(Форма, Источник, Индекс, СкрытьЗаголовок, Группа = Неопределено)   
	// Определяем группу родитель и текущий вызов на рекурсию
	Если Группа = Неопределено Тогда
		Группа = Форма.Элементы.Найти(Источник.Родитель.Имя);
		ЭтоРекурсия = Ложь;
	Иначе 
		ЭтоРекурсия = Истина;
	КонецЕсли; 
	// Добавляем элемент формы
	Копия = Форма.Элементы.Добавить(Источник.Имя + "_" + Индекс, ТипЗнч(Источник), Группа); 
	// Копируем реквизиты и параметры элемента из элемента источника
    Если ТипЗнч(Источник) = Тип("ГруппаФормы") Тогда
        СкопироватьГруппуФормыБезЭлементов(Форма, Источник, Копия);
		// Отключаем видимость группы пока не будут скопированы все элементы
		Если ЭтоРекурсия = Ложь Тогда                   
			Копия.Видимость = Ложь;
		КонецЕсли;
        СкопироватьПодчиненныеЭлементы(Форма, Копия, Источник, Индекс, СкрытьЗаголовок);
	ИначеЕсли ТипЗнч(Источник) = Тип("ПолеФормы") Тогда   
		Если Группа <>  Неопределено И СкрытьЗаголовок = Истина Тогда 
			Цвет = ?(Группа.ЦветФона.Вид = ВидЦвета.АвтоЦвет, New Цвет(255, 255, 255), Группа.ЦветФона); 
		Иначе
			Цвет = Неопределено;
		КонецЕсли;   
		СкопироватьПолеФормы(Форма, Источник, Копия, Индекс, Цвет);    
		СкопироватьПодчиненныеЭлементы(Форма, Копия.КонтекстноеМеню, Источник.КонтекстноеМеню, Индекс, СкрытьЗаголовок);
	Иначе
        ЗаполнитьЗначенияСвойств(Копия, Источник);
	КонецЕсли;  
	// Все элементы скопированы, возвращаем видимость группы  
	Если ЭтоРекурсия = Ложь Тогда                   
		Копия.Видимость = Источник.Видимость; 
		Возврат Копия;
	КонецЕсли;
КонецФункции // СкопироватьЭлемент()

// ***********************************************************************************************
// Сервисная процедура
// ***********************************************************************************************
Процедура СкопироватьПодчиненныеЭлементы(Форма, ГруппаКопии, Источник, Индекс, СкрытьЗаголовок)
    Для Каждого Элемент Из Источник.ПодчиненныеЭлементы Цикл
        СкопироватьЭлемент(Форма, Элемент, Индекс, СкрытьЗаголовок, ГруппаКопии);
    КонецЦикла; 
КонецПроцедуры // СкопироватьПодчиненныеЭлементы()              
  
// ***********************************************************************************************
// Сервисная процедура
// ***********************************************************************************************
Процедура СкопироватьПолеФормы(Форма, Источник, Копия, Индекс, ЦветЗаголовка) 
	Если ТипЗнч(Источник) = Тип("ПолеФормы") Тогда
        Копия.Вид = Источник.Вид;
		// Ищем опреатор []
		ЛевСкобка  = СтрНайти(Источник.ПутьКДанным, "[");
		ПрвСкобка = СтрНайти(Источник.ПутьКДанным, "[");
		Размер    = СтрДлина(Источник.ПутьКДанным); 
		Если ЛевСкобка = 0 ИЛИ ПрвСкобка = 0 Тогда 
			Копия.ПутьКДанным = Источник.ПутьКДанным;  
		Иначе
			Копия.ПутьКданным = Лев(Источник.ПутьКДанным, ЛевСкобка) + Индекс + Прав(Источник.ПутьКДанным, Размер - ПрвСкобка - 1);
		КонецЕсли;
        Если Источник.Вид = ВидПоляФормы.ПолеВвода Тогда
            ЗаполнитьЗначенияСвойств(Копия, Источник,, "ВыделенныйТекст, СвязьПоТипу, ПутьКДанным");
            Если  Источник.СвязьПоТипу.ПутьКДанным <> "" Тогда
                ПутьКДаннымСвязиПриемника = СтрЗаменить(Источник.СвязьПоТипу.ПутьКДанным, Источник.Имя, Копия.Имя);
                Копия.СвязьПоТипу = New СвязьПоТипу(ПутьКДаннымСвязиПриемника, Источник.СвязьПоТипу.ЭлементСвязи);    
            КонецЕсли; 
            ЗаполнитьКоллекциюСвойств(Копия.СписокВыбора, Источник.СписокВыбора);
        ИначеЕсли Источник.Вид = ВидПоляФормы.ПолеПереключателя Тогда
            ЗаполнитьКоллекциюСвойств(Копия.СписокВыбора, Источник.СписокВыбора);
            ЗаполнитьЗначенияСвойств(Копия, Источник,,"ПутьКДанным");
        ИначеЕсли Источник.Вид = ВидПоляФормы.ПолеТекстовогоДокумента Тогда
            ЗаполнитьЗначенияСвойств(Копия, Источник,,"ПутьКДанным, ВыделенныйТекст");
        ИначеЕсли Источник.Вид = ВидПоляФормы.ПолеФорматированногоДокумента Тогда
            ЗаполнитьЗначенияСвойств(Копия, Источник,,"ПутьКДанным, ВыделенныйТекст");
        Иначе
            ЗаполнитьЗначенияСвойств(Копия, Источник,,"ПутьКДанным");
		КонецЕсли; 
		Если ЦветЗаголовка <> Неопределено Тогда 
			Копия.ЦветТекстаЗаголовка = ЦветЗаголовка;
		КонецЕсли;
        СкопироватьСобытия(Копия, Источник);
    КонецЕсли; 
КонецПроцедуры // СкопироватьПолеФормы()                 

// ***********************************************************************************************
// Сервисная процедура
// ***********************************************************************************************
Процедура СкопироватьГруппуФормыБезЭлементов(Форма, Источник, Копия)
    Если ТипЗнч(Источник) = Тип("ГруппаФормы") Тогда
        Копия.Вид = Источник.Вид;
        Если Источник.Вид = ВидГруппыФормы.ОбычнаяГруппа Тогда
            ЗаполнитьЗначенияСвойств(Копия, Источник,, "ПутьКДаннымЗаголовка");  
        ИначеЕсли Источник.Вид = ВидГруппыФормы.Страницы Тогда
            ЗаполнитьЗначенияСвойств(Копия, Источник,, "ТекущаяСтраница");
            СкопироватьСобытия(Копия, Источник);
        ИначеЕсли Источник.Вид = ВидГруппыФормы.Страница Тогда
            ЗаполнитьЗначенияСвойств(Копия, Источник,, "ПутьКДаннымЗаголовка");      
        ИначеЕсли Источник.Вид = ВидГруппыФормы.ГруппаКолонок Тогда          
            ЗаполнитьЗначенияСвойств(Копия, Источник,, "ПутьКДаннымШапки");            
        Иначе
            ЗаполнитьЗначенияСвойств(Копия, Источник);
        КонецЕсли; 
    КонецЕсли; 
КонецПроцедуры // СкопироватьГруппуФормыБезЭлементов()

// *********************************************************************************************** 
// Сервисная процедура
// ***********************************************************************************************
Процедура ЗаполнитьКоллекциюСвойств(КолекцияКопия, КолекцияИсточник) 
    Для Каждого Элемент Из КолекцияИсточник Цикл
        ЗаполнитьЗначенияСвойств(КолекцияКопия.Добавить(), Элемент);
    КонецЦикла;  
КонецПроцедуры // ЗаполнитьКоллекциюСвойств()

// ***********************************************************************************************  
// Сервисная процедура
// ***********************************************************************************************
Процедура СкопироватьСобытие(Копия, Источник, ИмяСобытия)
    Действие = Источник.ПолучитьДействие(ИмяСобытия);
    Если Действие <> "" Тогда
        Копия.УстановитьДействие(ИмяСобытия, Действие);
    КонецЕсли; 
КонецПроцедуры // СкопироватьСобытие()

// ***********************************************************************************************
// Сервисная процедура
// ***********************************************************************************************
Процедура СкопироватьСобытия(Копия, Источник)
    СкопироватьСобытие(Копия, Источник, "Приизменении");
    СкопироватьСобытие(Копия, Источник, "НачалоВыбора");
    СкопироватьСобытие(Копия, Источник, "НачалоВыбораИзСписка");
    СкопироватьСобытие(Копия, Источник, "Очистка");
    СкопироватьСобытие(Копия, Источник, "Выбор");
    СкопироватьСобытие(Копия, Источник, "Регулирование");
    СкопироватьСобытие(Копия, Источник, "Открытие");
    СкопироватьСобытие(Копия, Источник, "ОбработкаВыбора");
    СкопироватьСобытие(Копия, Источник, "АвтоПодбор");
    СкопироватьСобытие(Копия, Источник, "ОкончаниеВводаТекста");
    СкопироватьСобытие(Копия, Источник, "ПриОбновленииСоставаПользовательскихНастроекНаСервере");
    СкопироватьСобытие(Копия, Источник, "ПриНачалеРедактирования");
    СкопироватьСобытие(Копия, Источник, "ПередНачаломДобавления");
    СкопироватьСобытие(Копия, Источник, "ПередНачаломизменения");
    СкопироватьСобытие(Копия, Источник, "ПриАктивизацииСтроки");
КонецПроцедуры // СкопироватьСобытия()
Показать


И полный листинг модуля формы элемента справочника "Контакты" тоже на русском
// ***********************************************************************************************
// Функция определяет новый ли это объект в управляемых формах
// ***********************************************************************************************
&НаСервере
Функция ЭтоНовыйОбъект()
    ОбъектДанных = РеквизитФормыВЗначение("Объект");
	Return ОбъектДанных.ЭтоНовый();
КонецФункции // ЭтоНовыйОбъект()	                                                                                


// ***********************************************************************************************
// ***********************************************************************************************
&НаСервере
Процедура ТелефоныДобавитьНаСервере()
	Строка = TableAsInputField.ДобавитьСтроку(ЭтаФорма, Объект.Телефоны, Элементы.ГруппаТелефон, 10);
	Если Строка <> Неопределено Тогда  
		Украина = Misc.ВычислитьНаСервере("Справочники.ТелефонныеКоды.НайтиПоКоду(""Украина"")");
		Строка.Код = Украина; 
	КонецЕсли;
КонецПроцедуры // ТелефоныДобавитьНаСервере()
&НаКлиенте
Процедура ТелефоныДобавить(Команда)
	ТелефоныДобавитьНаСервере();
КонецПроцедуры // ТелефоныДобавить()


// ***********************************************************************************************
// ***********************************************************************************************
&НаКлиенте
Процедура ТелефоныУдалить(Команда) 
	TableAsInputField.УдалитьСтроку(ЭтаФорма, Объект.Телефоны, Элементы.ГруппаТелефон);  	
КонецПроцедуры // ТелефоныУдалить()     


// ***********************************************************************************************
// *********************************************************************************************** 
&НаСервере
Процедура EmailДобавитьНаСервере()   	
	TableAsInputField.ДобавитьСтроку(ЭтаФорма, Объект.Email, Элементы.ГруппаEmail, 10);
КонецПроцедуры // EmailДобавитьНаСервере() 
&НаКлиенте
Процедура EmailДобавить(Команда)   	
	EmailДобавитьНаСервере();
КонецПроцедуры // EmailДобавить() 


// ***********************************************************************************************
// ***********************************************************************************************
&НаКлиенте                      
Процедура EmailУдалить(Команда)  
	TableAsInputField.УдалитьСтроку(ЭтаФорма, Объект.Email, Элементы.ГруппаEmail);    
КонецПроцедуры // EmailУдалить() 


// ***********************************************************************************************
// ***********************************************************************************************  
&НаКлиенте 
Процедура EmailОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, СтандартнаяОбработка)
	#Если Не ВебКлиент Тогда
	Если Misc.ПроверитьEmailАдрес(Текст) = Ложь Тогда
		ПредупреждениеАсинх("Введен не корректный адрес email!");	
	КонецЕсли; 
	#КонецЕсли
КонецПроцедуры


// ***********************************************************************************************
// ***********************************************************************************************
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)  
	TableAsInputField.ВывестиСтрокиТаблицыИсточника(ЭтаФорма, Объект.Email, Элементы.ГруппаEmail);
	TableAsInputField.ВывестиСтрокиТаблицыИсточника(ЭтаФорма, Объект.Телефоны, Элементы.ГруппаТелефон); 
КонецПроцедуры // ПриСозданииНаСервере()
Показать

И листинг функции ПроверитьEmailАдрес() из модуля Misc
// ***********************************************************************************************
// Проверяет адрес электронной почты на валиднось              
//
// Параметры:                                    
//  email  - адрес электронной почты на валиднось
//
// Возвращаемое значение:
//  Валидность - Истина / Ложь 
// ***********************************************************************************************  
Функция ПроверитьEmailАдрес(Знач email) Эксопрт

	// Создаем объект для работы  с регулярными выражениями
	RegExp = Новый COMОбъект("VBScript.RegExp"); 
	// Текст не многострочный
	RegExp.MultiLine = Ложь;     
	// Игнорировать регистр строки при поиске
	RegExp.IgnoreCase = Истина; 
	// Поиск по всей строке
	RegExp.Global = Истина;  
	// Шаблон, соответствующий произвольному email адресу
	RegExp.Pattern = ".+@.+\..+"; 
	// Возвращаем результат проверки
	Возврат RegExp.Test(email); 	
	
КонецФункции // ПроверитьEmailАдрес()
Показать

Название модулей оставил на английском, для исключения конфликтов с БСП и другими самописными модулями, так как сообщество использует только русский язык, то конфликт практически исключен))
Obertone; TreeDogNight; ixijixi; +3 Ответить
13. harchenko_pavel 41 20.09.21 17:18 Сейчас в теме
(12)
Функция ПроверитьEmailАдрес(Знач email) Эксопрт

Сори, допустил ошибку при переводе, не Эксопрт, а Экспорт, иногда при тайпинге пальцы опережают друг друга и символы меняются местами))

// ***********************************************************************************************
// Проверяет адрес электронной почты на валиднось              
//
// Параметры:                                    
//  email  - адрес электронной почты на валиднось
//
// Возвращаемое значение:
//  Валидность - Истина / Ложь 
// ***********************************************************************************************  
Функция ПроверитьEmailАдрес(Знач email) Экспорт

    // Создаем объект для работы  с регулярными выражениями
    RegExp = Новый COMОбъект("VBScript.RegExp"); 
    // Текст не многострочный
    RegExp.MultiLine = Ложь;     
    // Игнорировать регистр строки при поиске
    RegExp.IgnoreCase = Истина; 
    // Поиск по всей строке
    RegExp.Global = Истина;  
    // Шаблон, соответствующий произвольному email адресу
    RegExp.Pattern = ".+@.+\..+"; 
    // Возвращаем результат проверки
    Возврат RegExp.Test(email);     
    
КонецФункции // ПроверитьEmailАдрес()
Показать
14. awk 744 20.09.21 19:10 Сейчас в теме
Минус влепил, за избыточное и необоснованное смешивание языков. Пишите или на английском или на русском.
15. harchenko_pavel 41 20.09.21 19:33 Сейчас в теме
(14) Как только наберу рейтинг, влеплю минус в ответ за необоснованный минус.
Так между прочим, учитывая не восприятие сообществом английского синтаксиса, весь код уже переведен на русский.
Вы бы прочитали публикацию прежде чем минусы лепить, она уже обновлена!
Obertone; +1 Ответить
17. awk 744 20.09.21 20:15 Сейчас в теме
(15) Я знаю, что ты можешь поставить мне минус, подкараулить в подворотне и т.п. Но поскольку минус ставится анонимно, я оставил комментарий, кто и за что его поставил. Я не привык гадить исподтишка.

// Хороший код
Попытка
  б = 1 / 0;
Исключение
  ВызватьИсключение "Деление на ноль";
КонецПопытки;


// Good code
Try
  b = 1 / 0;
Except
  Raise "Devide by zero";
EndTry;


// Плохой код
Попытка
  б = 1 / 0;
Except
  Raise "Devide by zero";
EndTry;
18. harchenko_pavel 41 20.09.21 20:25 Сейчас в теме
(17)Полностью согласен
// Плохой код
Попытка
  б = 1 / 0;
Except
  Raise ("Devide by zero");
EndTry;
Но вот, такой вариант я плохим не считаю
// Не плохой код ИМХО
Try
  б = 1 / 0;
Except
  Raise("Деление на ноль");
EndTry;


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

Вообще я пишу на С, С++ и С#, исключительно на английском в том числе и комментарии, но такой подход мне кажется сложным к пониманию в 1С сообществе.

Вот пример моего С++ кода
#pragma once
/*
 * StrUtils.h
 *
 * Created: 20.06.2021 22:50:32
 * Author: Pavlo Kharchenko
 */
#ifndef STRUTILS_H_INCLUDED
#define STRUTILS_H_INCLUDED

#include <string>
using namespace std;

enum class radix {
    bin = 2,
    oct = 8,
    dec = 10,
    hex = 16
};

/**********************************************************************/
/*     Function of converting the number of any type to the string    */
/* ============================================================­====== */
/* value:      Number to convert                                      */
/* radix:      Numeral system - 2(bin) / 8(oct) / 10(dec) / 16(hex)   */
/* dec_places: Number of the places to the right of the decimal point */
/**********************************************************************/
template<typename T> string ntos(T value, uint8_t radix = 10, int32_t dec_places = -1) {
    static const char ns[] = "0123456789ABCDEF";
    string str = "\0";
    switch(radix) {
    case 2:
    case 8:
    case 10:
    case 16:
        break;
    default:
        return str;
    }
    uint8_t mod, index = 0;
    /* Handler for the signed part of the nuber */
    if(value < 0) { /* It is a negative number */
        value = (value < 0) ? 0 - value : value;
        if(value && dec_places != 0) {
            index = 1;
            str.ins ert(0, "-");
        } else {
            /* Value less than 0 and decimal places value is 0 */
            str.ins ert(0, "0");
            return str;
        }
    }
    /* Handler for the unsigned part of the number */
    uint32_t integer = uint32_t(value);
    do { /* Convert an integer part to string */
        mod = integer % radix;
        integer /= radix;
        str.ins ert(index, (const char*) &ns[mod], 1);
    } while(integer);
    /* Handler for the places to the right of the decimal point of the number */
    value -= (uint32_t) value; /* Substract an integer part */
    if(value || dec_places > 0) {
        if(dec_places > 0) {
            /* Rounding */
            uint32_t pow10 = 1;
            for(int32_t i = 0; i < dec_places; i++)
                pow10 *= 10;
            value *= pow10;
            value += 0.5f;
            value /= pow10;
        }
        str += '.';
        int32_t len = 0;
        do {
            value *= 10;
            integer = (uint32_t) val ue;
            val ue -= integer;
            mod = integer % radix;
            integer /= radix;
            str += (const char) ns[mod];
            if(!val ue && dec_places < 0)
                break;
        } while(++len != dec_places);
    }
    return str;
}

#endif
Показать

Но не думаю, что такой подход будет воспринят 1С сообществом.

Кроме того я пошел на встречу сообществу и полностью русифицировал проект еще до вашего минуса, поэтому ваш комментарий меня возмутил.
19. awk 744 20.09.21 20:39 Сейчас в теме
(18)
Представьте, что вы индус читающий такой (по вашему правильный код).
#include <iostream>
using namespace std;

int main() 
{ 
    int Успех;
    cout << "Hello, world!" << endl;
    return Успех; 
}
Показать
20. harchenko_pavel 41 20.09.21 20:46 Сейчас в теме
(19)Вы кажется меня не поняли, такой подход применим только в 1С, в других языках имена переменных, функций, классов и других объектов могут быть записаны только латиницей. Вы поймите, что код 1С рассчитан на русское сообщество, а на других языках программирования на мировое сообщество, и соответственно на С, С++, С# я пишу только на английском, в том числе и комментарии, так как мой код может использоваться в других проектах, в том числе и Индусами.
Я же вам объяснил, свои мотивы такого подхода к написанию кода на 1С. Зачем вы сюда Индусов приплели, если они разрабатывают что-то под 1С, то с русским языком у них проблем быть не должно, ну а с английским тем более.
Более того я вам показал пример моего кода на С++, вы там увидели где-то хоть один кириллический символ?

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


И где это вы увидели у меня такой вариант совмещения синтаксиса, или опять же вы это сами надумали исходя из комментариев?
// Плохой код
Попытка
  б = 1 / 0;
Except
  Raise ("Devide by zero");
EndTry;
Спешу вас заверить, что такого смешения языков у меня не было, нет и не будет.

А вот такой подход к написанию, да я использовал в 1С, но решил отказаться в публичных проектах в угоду сообщества.
// Не плохой код ИМХО
Try
  б = 1 / 0;
Except
  Raise("Деление на ноль");
EndTry;


Такое впечатление, что вы и не читали мою публикацию внимательно, так пробежались по комментариям, и от доброты душевной решили влепить мне минус? Я повторюсь, посмотрите публикацию, весь английский синтаксис был заменен на русский по просьбе сообщества, еще до вашего минуса. Меня не затруднило потратить пол часа моего времени и переписать код в виде удобном для остальных 1С разработчиков.
Так за что минус, просто так?
23. awk 744 20.09.21 21:27 Сейчас в теме
(20) Вы не знаете С++ и С# (по си не уверен). В обоих языках можно писать имена переменных кириллицей. Более того из-за наличия в C++ макросов, вы целиком код можете написать на русском языке.
26. harchenko_pavel 41 20.09.21 22:22 Сейчас в теме
(23)Я изучал эти языки по книгам Шилдта, Прата, Страуструпа, пишу под ARM и изредка под ПК, в случае возникновения вопросов, ответы всегда искал только в англоязычном сообществе, поэтому кириллица мне не встречалась, и даже если бы я знал о возможности её использования в С++ и C#, я бы в жизни это не сделал.
Вы не знаете С++ и С# (по си не уверен)
А вот это утверждение считаю не уместным, вы меня не знаете, я вас тоже. По образованию я инженер - программист. Я начал изучать языки программирования еще в далеком 1991г., первым был Basic, в 1992г. Pascal. Когда появился Object Pascal в дальнейшем Delphi это было вау, переход с процедурного языка на ООП это круто. На С и С++ я пишу с 2010г., в С конечно не хватает ООП, но в большинстве проектов под ARM C++ не нужен.
Два месяца назад я решил реализовать личный проект на 1С 8 и начал писать на нем, и ООП сильно не хватает, насколько было бы удобней например, наследовать класс Справочник, добавить в него дополнительные методы или изменить существующие, и в дальнейшем применять его где нужно, далее наследовать и добавлять новые методы. Да и возможность написания своих классов, а не использование только предопределенных куда удобнее. А так получается в 1С 8 заявлен ПОП, но по факту если нужно писать свои методы, то 1С 8 это процедурный язык.
В 1С 8 в некоторых случаях нельзя скрыть методы, некоторые называют сокрытие данных инкапсуляцией, но это не совсем так, инкапсуляция это объединение данных внутри объекта, а не только их сокрытие, и в принципе можно сказать что инкапсуляция в 1С есть, например можно инкапсулировать методы внутри общего модуля, и ограничить к некоторым методам доступ сделав их не экспортными, но если например мне надо разместить в общем модуле асинхронную процедуру или процедуру с оповещением, в этом случае процедура, вызываемая из асинхронной процедуры как и процедура оповещение, должна быть экспортной, и будет доступна разработчику через оператор доступа .(точка), ну как так?
Переменное число аргументов, ну почему это не реализовано, ведь в некоторых ситуациях удобней передать аргументы через запятую, а не упаковывать их в коллекцию, или делать как в БСП
Процедура ЧтоТоСделать(Параметр1 = Неопределено, 
                                             Параметр2 = Неопределено, 
                                             Параметр3 = Неопределено,
                                             Параметр4 = Неопределено,
                                             Параметр5 = Неопределено,  
                                             Параметр6 = Неопределено,
                                             Параметр7 = Неопределено,
                                             Параметр8 = Неопределено,
                                             Параметр9 = Неопределено,
                                             Параметр10 = Неопределено, и т.д.)
    Если параметр1 <> Неопределено Тогда
       ПереданныйПараметр = Параметр1;
    ИначеЕсли параметр2 <> Неопределено Тогда
       ПереданныйПараметр = Параметр2;
    ИначеЕсли  параметр3 <> Неопределено Тогда
       ПереданныйПараметр = Параметр3;
    ИначеЕсли  параметр3 <> Неопределено Тогда
       ПереданныйПараметр = Параметр4;
    ИначеЕсли  параметр3 <> Неопределено Тогда
       ПереданныйПараметр = Параметр5;
    ИначеЕсли  параметр3 <> Неопределено Тогда
       ПереданныйПараметр = Параметр6;
    ИначеЕсли  параметр3 <> Неопределено Тогда
       ПереданныйПараметр = Параметр7;
    ИначеЕсли  параметр3 <> Неопределено Тогда
       ПереданныйПараметр = Параметр8;
    ИначеЕсли  параметр3 <> Неопределено Тогда
       ПереданныйПараметр = Параметр9;
    ИначеЕсли  параметр3 <> Неопределено Тогда
       ПереданныйПараметр = Параметр10;
       //и т.д.
    КонецЕсли;
КонецПроцедуры
 
Показать

Конечно можно сделать так и сократить код, но это все костыли((
Процедура ЧтоТоСделать(Параметр1 = Неопределено, 
                                             Параметр2 = Неопределено, 
                                             Параметр3 = Неопределено,
                                             Параметр4 = Неопределено,
                                             Параметр5 = Неопределено,  
                                             Параметр6 = Неопределено,
                                             Параметр7 = Неопределено,
                                             Параметр8 = Неопределено,
                                             Параметр9 = Неопределено,
                                             Параметр10 = Неопределено, и т.д.)
     Для НомПараметра = 1 По <колличество параметров> Цикл
             Попытка 
                    ПереданныйПараметр = Вычислить("Параметр" + НомПараметра);
                    Прервать;
            Исключение
            КонецПопытки;
    КонецЦикла;
КонецПроцедуры
Показать
29. awk 744 20.09.21 22:45 Сейчас в теме
(26) Не похоже, что вы пишете так долго. Ваши посты больше напоминают студента-отличника, а не разработчика с 30-летним опытом. Тем более не похожи вы на свичера. Человек знающий более одной парадигмы программирования никогда не будет сетовать на отсутствие той или иной возможности. 1С - это предметно-ориентированный язык. Глупо требовать от него ООП. За тридцать лет вы никогда не работали в команде? Вы не знаете, что стандарты - это то, что отличает кустаря от промышленного разработчика? Вы же заявляете что знаете С++ и Си шарп. Вы так же предъявляете в Си шарп, что с указателями можно работать только в небезопасном коде? Или что нет оператора delete? Да и зачем человеку, который заявляет:

1. Каждый программист должен знать английский (почему не китайский? Китай - первая экономика мира)
2. 10+ опыта на С++

1С? На Украине 1С вроде запретили. Об разработчиков с Украины на западе только положительные отзывы, а в РФ то же самое, что на Украине (экономика, политика и т.д.).

Короче говоря - ваши заявления, как-то не проходят проверки банальной логикой.

Возможно вы инженер (возможно высококлассный инженер), который занимался как хобби программированием, но точно не профессиональный разработчик, хотя бы среднего уровня.
МимохожийОднако; +1 Ответить
33. harchenko_pavel 41 20.09.21 23:23 Сейчас в теме
(29)
1. Каждый программист должен знать английский (почему не китайский? Китай - первая экономика мира)
Да потому же, почему не украинский, белорусский, казахский, болгарский и так можно продолжать еще долго, всего на Земле насчитывается 7139 языка.

Возможно вы инженер (возможно высококлассный инженер), который занимался как хобби программированием, но точно не профессиональный разработчик, хотя бы среднего уровня.
Как скажите, не вижу смысла продолжать упражняться в эпистолярном жанре, все равно конструктивного диалога у нас вами не получается, и это не имеет никакого отношения к публикации.
Не вижу смысла разводить оффтоп.
21. harchenko_pavel 41 20.09.21 20:52 Сейчас в теме
(19)И все таки прокомментируйте пожалуйста вот это сообщение
Кроме того я пошел на встречу сообществу и полностью русифицировал проект еще до вашего минуса, поэтому ваш комментарий меня возмутил.
За что вы поставили мне минус, просто так?
22. awk 744 20.09.21 21:23 Сейчас в теме
(21) Когда я читал статью, код был не русифицирован (можно было, кстати, и на английский его целиком перевести) протокол http - stateless. Поставил минус, что бы новички так не писали. А что бы знали кто и когда минус ставил - оставил комментарий.

Минус, я изменил на плюс, после того как увидел измененную статью. Ваш рейтинг теперь больше пяти и вы можете ставить мне минусы.
24. harchenko_pavel 41 20.09.21 21:32 Сейчас в теме
(22)Нет желания ставить минусы просто так, вопрос закрыт, мы друг друга услышали.
25. awk 744 20.09.21 21:57 Сейчас в теме
(24) Еще момент по коду. Не стоит использовать
RegExp = Новый COMОбъект("VBScript.RegExp");


Это как минимум не будет работать на МакОС и Линукс, а как максимум на х64 разрядном сервере. Есть нативная компонента регулярных выражений для 1С - https://github.com/alexkmbk/RegEx1CAddin.
27. harchenko_pavel 41 20.09.21 22:28 Сейчас в теме
(25) Я это знаю, но это серверная функция, и я рассчитывал, что сервер 1C крутится на Windows Server
54. Sashares 35 23.09.21 15:36 Сейчас в теме
(22)
Ваш рейтинг теперь больше пяти и вы можете ставить мне минусы.

Чтобы поставить минус, надо рейтинг 30.
55. awk 744 23.09.21 15:38 Сейчас в теме
(54) Я стар - я супер стар...

Раньше можно было с пяти...
16. пользователь 20.09.21 19:42
Сообщение было скрыто модератором.
...
28. noprogrammer 239 20.09.21 22:41 Сейчас в теме
(16) Не стоит так близко к сердцу воспринимать критику (пусть даже по вашему мнению необоснованную). Ждем новых публикаций (с календарем интересно посмотреть)
30. harchenko_pavel 41 20.09.21 22:47 Сейчас в теме
(28)Ок, через несколько дней выложу
35. RustIG 1747 22.09.21 09:50 Сейчас в теме
(30) производственный календарь - что это ?
36. harchenko_pavel 41 22.09.21 11:41 Сейчас в теме
(35)Это тема для следующей публикации, как только организм справится с острой фазой COVID-19, моя реализация пяти дневного производственного календаря без БСП, для встраивания в самописные конфигурации, с настраиваемым оформлением, автоматическим расчётом Пасхи и Троицы. С общим модулем для работы с календарем, в котором реализованы разные функции, например
ПолучитьБанковскиеДниЗаПериод(НачалоОтбора,  КонецОтбора)
БанковскихДнейВПериоде(НачалоПериода, КонецПериода)
ПолучитьДатуОкончанияБанковскогоПериода(НачалоПериода, БанковскихДней)
ПолучитьПраздничныеДниЗаПериод(НачалоОтбора, КонецОтбора)
ОпределитьТипДняНаIsDayOffRU(НаДату, ПоДату = Неопределено,  Страна)
и др.
39. RustIG 1747 22.09.21 12:25 Сейчас в теме
(36) ясно, что ж, подожду ... тема актуальна, делал на обычных формах что-то подобное...
а вам скорейшего выздоровления!
pavlov_dv; harchenko_pavel; +2 Ответить
34. RustIG 1747 22.09.21 09:49 Сейчас в теме
(0) есть типовые конфигурации, в которых в справочнике Организации реализован подобный подход - задавать емэйл и телефоны через поля ввода.
Я полагаю, что разработчики типовых конфигураций не смогли договориться с разработчиками платформы о том, чтобы в табличной части уметь накладывать и отображать шаблоны строковых значений.
На лицо ограничение платформы.
На ИС много разного - как обойти то или иное ограничение платформы ... Но широкого применения подобные разработки не получают...
37. harchenko_pavel 41 22.09.21 12:03 Сейчас в теме
(34)Я видел такой функционал в демо конфигурации БСП, но интегрировать БСП в свой проект не было необходимости, поэтому я даже не смотрел как у них это реализовано.
Кроме того, меня вполне устраивало, как отображаются данные в таблице формы, пока я не открыл эти формы в ВебКлиенте, и обнаружил, что выравнивание таблиц сместилось на десяток пикселей, вроде не критично, но смотрится такая асимметрия не очень, кроме того при однострочном выводе таблицы, на ВебКлиенте не отображается содержимое строк у некоторых таблиц, хотя оно там есть (поле "Телефон" на скриншоте), если установить количество строк отображения от 2-х и более, то данные становиться видны. В другом справочнике, не видно было файлы, хотя эта таблица была скопированы из другого справочника, единственное отличие, было в ее положении на форме. Скриншоты с тонкого клиента и ВебКлиента, прикрепил к комментарию. Можно конечно было вынести таблицы на отдельные страницы, установить неограниченное количество строк для отображения, но я не захотел это делать и решил реализовать динамический вывод строк таблиц в поля ввода.
Только не пинайте за нежелание использовать БСП.
БСП это монстр с огромным функционалом, все ее объекты имеют перекрестные связи с друг другом, что бы все работало как надо, желательна полная интеграции. Поэтому для маленьких, узконаправленных конфигураций, например как склад без бух. учета, интеграция БСП избыточна ИМХО.
Прикрепленные файлы:
38. RustIG 1747 22.09.21 12:21 Сейчас в теме
(37)да, полностью согласен. теперь понятно. поддержу ваш проект.
43. rpgshnik 3795 23.09.21 05:33 Сейчас в теме
(37) ну как избыточна интеграция БСП, присутствует методика разработки и стандартизации решений. Если вы будите городить свой справочник Пользователей и свои группы ролей... когда это уже всё есть в БСП это будет странно и не красиво, есть такие разработчики на 1С и их много увы, причем нацеленные на тиражируемые решения :)) И открою секрет, БСП можно задействовать частично, допустим только пользователей... Это удобно в последствие для интеграции с другими типовыми решениями. В целом БСП очень комфортная библиотека, есть и другие, например БПО... Общий интерфейс решений превыше всего, конечному пользователю проще ориентироваться...

НО! Если уж проект совсем обособленный и никогда не увидит контакта с каким либо решениям на 1С, то возможно соглашусь, что БСП вам не нужно.
triviumfan; +1 Ответить
44. noprogrammer 239 23.09.21 12:24 Сейчас в теме
(43)
когда это уже всё есть в БСП это будет странно и не красиво, есть такие разработчики на 1С и их много увы, причем нацеленные на тиражируемые решения :)) И открою секрет, БСП можно задействовать частично, допустим только пользователей...

А Вы когда нибудь пробовали, что нибудь вынести из БСП?! Это просто ад адский (там все переплетено хуже чем когда леска на рыбалке в моток закручивается)... вот с БПО такой проблемы нет. То как написана БСП - так подсистемы не пишут.
45. rpgshnik 3795 23.09.21 12:29 Сейчас в теме
46. noprogrammer 239 23.09.21 12:33 Сейчас в теме
(45) что зачем? зачем выносить? или зачем писАть подсистемы по другому? (не совсем понял вопрос)
47. rpgshnik 3795 23.09.21 14:08 Сейчас в теме
(46) зачем выносить конечно.
48. noprogrammer 239 23.09.21 14:21 Сейчас в теме
(47) Цитата
И открою секрет, БСП можно задействовать частично, допустим только пользователей

Я так понимаю, данная фраза говорит о том, что можно вынести только часть функционала БСП в свою разработку? или я не правильно понял посыл?.
49. rpgshnik 3795 23.09.21 14:26 Сейчас в теме
(48) не правильно конечно, при интеграции БСП в свою конфигурацию можно установить только необходимую функциональность, допустим Пользователи, конечно при необходимости помощник установки БСП отметить необходимые зависимые "модули".
50. noprogrammer 239 23.09.21 14:31 Сейчас в теме
(49) Ясно. И потащит он за собой кучу всего...
52. harchenko_pavel 41 23.09.21 15:12 Сейчас в теме
(50)Именно так и будет, о чем я написал в (51)
58. Sashares 35 23.09.21 15:53 Сейчас в теме
(50)Вы бы посмотрели сначала документацию.
Например, БСП 3.1.3 - Пользователи одна из 3х обязательных подсистем. Можно внедрить только 3 подсистемы БСП и все, у вас есть Пользователи в базе.
Прикрепленные файлы:
rpgshnik; +1 Ответить
73. harchenko_pavel 41 23.09.21 17:41 Сейчас в теме
(58)Специально решил проверить, в обработке "Первое внедрение БСП", выбрано "Базовая функциональность", "Обновление версии ИБ", "Пользователи". Объединяю согласно документации, использую сгенерированный файл настроек xml, при объединении получаю окно "Обнаружены ссылки на следующие объекты, неотмеченные на участие в объединение" на три страницы, ну как так, выше же писали, что можно интегрировать только базовый функционал и пользователей, а там оказывается еще целая куча всего тянется. Более того даже если согласиться и добавить эти не включенные подсистемы и объекты системы, то все равно будут не устранённые зависимости, проверено. Или я что-то делаю не так? Но как тогда так, все же сделано шаг за шагом в соответствие с документацией, но отдельные компоненты БСП интегрировать не получается, все подсистемы связаны, практической пользы от обработки "Первое внедрение БСП" нет, для того чтобы все работало без ошибок надо интегрировать всю библиотеку, превращая простую конфигурацию практически в типовую.
Прикрепленные файлы:
74. Sashares 35 23.09.21 17:52 Сейчас в теме
(73) См. шаг 2.
Прикрепленные файлы:
75. Sashares 35 23.09.21 18:32 Сейчас в теме
(73) Еще раз - это нормально, что есть ссылки на объекты других подсистем.
Т.к. например, у пользователей есть табличные части для подсистем Контактная информация и Свойства.
Есть определяемые типы, функциональные опции, в которых содержатся объекты других подсистем.
Поэтому просто жмете Продолжить - лишние объекты пропадут при объединении.
Далее надо выполнить действия по документации для внедряемых подсистем, в том числе пункт "для особых случаев внедрения" - без зависимых подсистем.
Например, для пользователей - см. файл.
Прикрепленные файлы:
87. triviumfan 97 28.09.21 14:06 Сейчас в теме
(75) Вот уж странно, на дворе 21 год, а люди до сих пор не знакомы с БСП :)
51. harchenko_pavel 41 23.09.21 15:10 Сейчас в теме
(47)Хочу объяснить почему я не стал использовать БСП.
Запустил я обработку "Первое внедрение БСП", отметил, те системы, которые хочу интегрировать, сохранил xml файл.
Открыл свою конфигурацию в режиме конфигуратора, выбрал "Сравнить, объединить конфигурацию из файла", указал путь к БСП и загрузил сгенерированный xml файл с настройками, далее более двух часов сравнения, все в один поток, Core I7 11 поколения, раз в 3-5 минут нагружается на 1%, конфигуратор на глухо висит, оптимизация прямо на высоте!
По окончании сравнения система заявляет мне, что оказывается есть еще связи с другими объектами, которые почему-то не были включены в сгенерированный xml файл, почему мне не понятно.
Соглашаюсь на включение этих объектов, и опять два часа зависания, именно зависания, конфигуратор в этот момент висит на глухо и не отвечает, все это опять же в один поток, с периодической загрузкой процессора на 1%.
Все вроде процесс окончен, БСП интегрировано, запуская конфигурацию - куча ошибок, начинаю разбираться, оказывается, что есть еще связи не замеченные системой, начинаю интегрировать недостающие модули и объекты, а в них опять связи с другими объектами, и так бесконечно продолжается до того момента, пока не интегрируешь всю БСП.
Но мне не нужно и 10% функционала БСП, в не бухгалтерском проекте, и какой мне смысл включать его полностью не пойму.
Кроме того если нужно исправить какой-то предустановленный справочник в контексте не добавления чего-либо на него, а удаления, учитывая все перекрёстные связи, то это многочасовой процесс, плюс чтобы сохранить возможность обновления, это надо делать в расширении.
БСП не возможно просто кастомизировать, она огромна и избыточна для маленьких проектов.
Если я не прав, поправьте меня пожалуйста, учитывая мой небольшой 2-х месячный опыт, программирования в 1С, вполне возможно, что я просто чего-то не знаю.
Или возможно, что это проблема новых версий БСП и раньше было по другому, но я этого знать не могу.
noprogrammer; +1 Ответить
56. Sashares 35 23.09.21 15:45 Сейчас в теме
(51) Ну то есть в 2х словах - внедрить БСП вы не смогли, поэтому БСП по вашему плохая.

Но мне не нужно и 10% функционала БСП, в не бухгалтерском проекте, и какой мне смысл включать его полностью не пойму.

Читать документацию по БСП пробовали? Не просто запускать приложенные обработки, а читать порядок внедрения библиотеки? На ИТС есть подробная документация по разным версиям БСП и другим библиотекам.

В документации описано какие подсистемы обязательные, какие нет. Всю БСП встраивать никакой необходимости нет.
Если у вас не получилось встроить БСП, а у других получается, может проблема не в БСП?
57. noprogrammer 239 23.09.21 15:49 Сейчас в теме
(56) Проблема не в том, что бы встроить БСП в свою разработку а в том, чтобы встроить отдельную подсистему из БПС в свою разработку.
Все подсистемы БСП переплетены друг с другом как.... это надо было умудриться так ее написать...
59. Sashares 35 23.09.21 15:58 Сейчас в теме
(57)
Все подсистемы БСП переплетены друг с другом как.... это надо было умудриться так ее написать...

Нет.
Есть обязательные подсистемы, в БСП 3.1.3 их 3. Их встроить надо обязательно.
Остальные подсистемы можно не встраивать.
Но если нужен какой-то функционал из подсистем БСП, в документации есть таблица зависимостей подсистем.
При этом не все зависимые подсистемы нужны обязательно, да и не у всех подсистем есть зависимости.

Вы преувеличиваете сложность встраивания.
60. noprogrammer 239 23.09.21 16:01 Сейчас в теме
(59)
Вы преувеличиваете сложность встраивания.

Да, нет, к сожаление не преувеличиваю. Внедрить конечно же можно (вопрос времени), но тогда своя конфа превратиться в нечто ...
62. Sashares 35 23.09.21 16:10 Сейчас в теме
(60) Я встраивал БСП, обновлял, ничего криминального с конфигурацией не случилось.
Ну есть метаданные в конфигурации, которые не обязательно нужны, есть пить они не просят, стоят на поддержке и при обновлении их можно обновить автоматом.
В последних версиях БСП много лишнего функционала перенесли из обязательных подсистем либо в отдельные не обязательные подсистемы, либо в отдельные библиотеки (БТС, БИП), которые не обязательны к внедрению.
Зато не надо функционал разрабатывать самому, он есть и развивается.
rolin555; rpgshnik; +2 Ответить
61. harchenko_pavel 41 23.09.21 16:10 Сейчас в теме
(56)А разве я говорил, что БСП плохая? Напротив, я писал, что БСП это монструозная библиотека, с огромным количеством возможностей, большая часть которых мне не нужна.
Системы для интеграции, я выбирал в обработке "Первое внедрение БСП", все связанные системы, обработка отмечала автоматически. И да я не знал, что нужно еще что-то доставлять самому, мне казалось, что инструмент интеграции должен работать корректно, иначе зачем он нужен.
Еще раз хочу акцентировать внимание на том, что я не считаю БСП плохой библиотекой, по функционалу она монструозная, но вот в отношении самого дизайна этой библиотеки вопросы есть, частичная интеграция ее систем не всегда проста и понятна, а порой и не возможна без интеграции не малого количества связанных подсистем. Мне как начинающему программисту 1С, это было не просто, я привык, что все работает с коробки, без дополнительных танцев с бубнов в виде устранения зависимостей и доинтеграции того, что обработка "Первое внедрение БСП" не включила в сгенерированный и ею файл настроек xml.
Прикрепленные файлы:
63. Sashares 35 23.09.21 16:14 Сейчас в теме
(61) У подсистем могут быть зависимости от не обязательных подсистем. Тогда в документации могут быть описаны особенности внедрения.
То есть, если потребовалось встроить Электронную подпись - совсем не обязательно встраивать ее зависимые подсистемы.
Прикрепленные файлы:
rpgshnik; +1 Ответить
64. harchenko_pavel 41 23.09.21 16:16 Сейчас в теме
(63)Понятно, ради интереса попробую внедрить генерацию штрихкода, для склада пригодится
65. harchenko_pavel 41 23.09.21 16:34 Сейчас в теме
(63)Это у всех так, загрузка процессора 0,4% и пару часов ждать, или только у меня?
ПК Intel® NUC 11 Enthusiast — NUC11PHKi7CAA
Intel® NUC 11 Extreme Mini PC, w/ Core™ i7, RTX 2060, Optane™ Mem H10 (32GB+2TB) Solid State Storage, 64G RAM, Windows® 10 Pro
Other features: Includes far-field quad array microphones, PC Stand for vertical operating orientation.
Прикрепленные файлы:
76. harchenko_pavel 41 23.09.21 19:45 Сейчас в теме
(63)Наконец-то закончилось объединение. Все сделано по инструкции, синтаксических ошибок нет, а вот анализ конфигурации показал 82 ошибки/предупреждения, из них две мои, не используемая функция ЭтоНовыйОбъект() и отсутствующий обработчик ПриОткрытии(). Может это и не критично что интеграция БСП добавила 80 ошибок/предупреждений в конфигурацию и даже может все будет работать, но так не должно быть ИМХО. Кроме того в EDT все это будет отмечено красным крестом и восклицательным знаком, в коммерческом продукте так оставлять точно нельзя. Или везде вставлять //@skip-warning ?
Прикрепленные файлы:
79. Sashares 35 23.09.21 22:39 Сейчас в теме
(76)Часть ошибок не ошибки - про вызов процедур - уже написал.
Часть ошибок вы исправить можете - у справочника Пользователи и Внешние пользователи очистите поля закладки Характеристики - они нужны для подсистем Свойства и Контактная информация.
Ошибки в справке - потому что в справке ссылки на объекты и разделы других подсистем. Их можно исправить, удалив такие ссылки.

Про справочник Контакты - это ошибки в вашем справочнике, в БСП такого нет.
Прикрепленные файлы:
81. harchenko_pavel 41 23.09.21 22:48 Сейчас в теме
(79)
Про справочник Контакты - это ошибки в вашем справочнике, в БСП такого нет.
Да так и есть, я об этом сразу и написал
(76)...из них две мои, не используемая функция ЭтоНовыйОбъект() и отсутствующий обработчик ПриОткрытии().
83. rpgshnik 3795 25.09.21 08:58 Сейчас в теме
(76) слушай, ну вот я сколько пробовал вроде неудобства такого не было, возможно на каком-то этапе, что-то делаешь не правильно. Посмотри тут за 12 минут как раз преподаватель устанавливает БСП с минимальнейшей функциональностью и всё взлетает. Видео очень полезное https://youtu.be/Tdot8e0Ngqs
84. harchenko_pavel 41 25.09.21 11:53 Сейчас в теме
(83)Спасибо, посмотрю
rpgshnik; +1 Ответить
89. bobtb 3 07.10.21 17:53 Сейчас в теме
(84) 1С уже давно делает упор не на конфигуратор, а на EDT (Eclipse). Советую перейти на него, там ваши мощности будут задействованы полноценно.
40. rpgshnik 3795 22.09.21 15:14 Сейчас в теме
А почему всё не написали на английском? Когда виду такое аж 🤢🤮
41. harchenko_pavel 41 22.09.21 17:12 Сейчас в теме
(40)Я же уже объяснял, английский синтаксис короче чем русский, я использовал английский синтаксис только для операторов и ключевых слов. Мог ли я писать полностью на английском, конечно да, было бы ли мне проще опять же да.
Мне сложно воспринимать после С и С++: Знач, Перем, Лев, Прав, Для, Асинх, Цел
Val, Var, Left, Right, For, Async, Int для меня выглядят куда понятней и логичней.
Чтобы вы понимали я пишу на 1С 2 месяца с перерывами, основная моя специализация это программирование под ARM, пять лет назад под Atmega. Я не планирую продолжать писать на 1С, по истечении месяца, чрез который я планирую закончить свой не коммерческий проект с использованием 1С.
Ещё у 1С очень кривой перевод на русский, ну как например Modified (изменено) можно было перевести как Модифицированность, это же даже разные части речи! Или For, в контексте 1С это От, а не Для, ну разве так не логичней От число = 1 До 10 Цикл <тело цикла> КонецЦикла;?
Не хватает операторов ++, —, +=, -=, *=, /=, %= и ^= для булево. Добавить их поддержку разработчикам 1С ни чего не стоит, а ведь гораздо удобнее было бы, например использовать такую запись ИндексСтрокиПоискаЗначения++; чем ИндексСтрокиПоискаЗначения = ИндексСтрокиПоискаЗначения + 1;
А ещё эти операторы можно было бы использовать в условии,
Если ++ИндексСтрокиПоискаЗначения Тогда <выражение> КонецЕсли;
вместо
ИндексСтрокиПоискаЗначения = ИндексСтрокиПоискаЗначения + 1;
Если ИндексСтрокиПоискаЗначения Тогда <выражение> КонецЕсли;

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

Поняв, что сообщество не воспринимает такой подход к оформлению, я перевёл всё на русский, так зачем опять затрагивать эту тему?
А стандарты 1С между прочим нельзя прочитать если у тебя нет платной подписки, как и практически весь справочный материал у них на сайте, поэтому остаются только синтаксис помощник и книги Хрусталёвой и Ко.
42. rpgshnik 3795 23.09.21 05:26 Сейчас в теме
(41) да в 1С всё по другому и у нас не возбраняется количество символов и нам не доплачивают за их минимизацию. Так как основное направление языка 1С:Предприятие это бизнес стран бывшего СССР и зачастую программист 1С очень сильно погружен в контекст предметной области, соответственно требуется внятное описание тех или иных функций даже не в комментарии, а в самих переменных и название соответственно функции. По этому никто не привык здесь гнаться за краткостью, ибо предметная область важнее и лучше знать просто по названию переменной что она содержит при отладке чужого кода.

Ваш функционал не относиться к какой либо предметной области, но выглядит не канонически и воспринимается как моветон, при его чтение. От сюда и негатив. Всё нормально, просто у нас не пишут на английском, даже например Email, пишут как ЭлектроннаяПочта :)

Исключение синтаксист определенный разработчиками, типа СтрокаXML - что например меня бесит :) можно было ведь без переключения на английский просто СтрокаХМЛ... ну да ладно, есть и другие неизбежности КомСоединение = Новый COMОбъект("V82.COMConnector") и т.п.

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

Не использовать БСП нынче тоже моветон.

Удачи в проекте.
85. МимохожийОднако 142 26.09.21 09:46 Сейчас в теме
(41) На ИТС есть недельный бесплатный доступ. Читай, что хочешь. Если работаешь с какой-нибудь организацией, то можно договориться с ними читать ИТС под ихним аккаунтом.
Доступно и всерьез
86. пользователь 27.09.21 11:09
Сообщение было скрыто модератором.
...
66. Sashares 35 23.09.21 16:38 Сейчас в теме
(65)При каком действии?
Так то конфигуратор работает в однопоточном режиме, поэтому с Core I7 100% ожидать не стоит. Максимум он может 1 ядро занять.

Если при загрузке настроек сравнения объединения, могу предложить не использовать данный пункт, а отметить вручную по инструкции https://its.1c.ru/db/bsp315doc#content:3:1
При первом внедрении там просто
Шаг 1 - Действия - отметить по подсистемам файла - отметить нужные подсистемы
Шаг 2 - изменить отдельные флаги свойств по документации
Шаг 3 - выполнить настройку объектов
Прикрепленные файлы:
67. harchenko_pavel 41 23.09.21 16:46 Сейчас в теме
(66)
При каком действии?
При объединении.
1С написана С++, не так давно, в 2018 систему перевели на C++14 (а потом и на C++17), по словам разработчиков они перевели 10 миллионов строк кода, ну почему было не реализовать многозадачность, есть же boost::thread. Да и операторы ++, -- и др. могли бы заодно добавить, но нет((
68. Sashares 35 23.09.21 16:51 Сейчас в теме
(67) Тут я ничего не скажу.
Если вы относитесь к франчу, можете задать этот вопрос разработчикам платформы на ближайшем семинаре - в эти выходные.

https://sem0921.1c.ru/
69. harchenko_pavel 41 23.09.21 16:52 Сейчас в теме
(66)Интегрирую только пользователей и штрих-коды, все сделал по инструкции, кроме того задействовал удаление не используемого кода, в ходе объединения получаю вот такое окно, ну не должно быть так в релизном продукте, это же не альфа какя-то
Прикрепленные файлы:
70. Sashares 35 23.09.21 16:54 Сейчас в теме
(69)
Интегрирую только пользователей и штрих-коды

1 - Обязательных подсистем 3. Обязательные надо встроить все - БазоваяФункциональность, ОбновлениеИБ, Пользователи
2 - Не ту конфигурацию используете. Вы взяли конфу демо базы БСП.
3 - И при правильной настройки ссылки на объекты будут, это нормально, надо просто нажать Продолжить, отмечать их не надо.
harchenko_pavel; +1 Ответить
71. harchenko_pavel 41 23.09.21 16:56 Сейчас в теме
(70)Все это выбрано, конфу выбрал эту, так как она была модифицирована обработкой "Первое внедрение БСП", а именно функцией удалить неиспользуемые строки кода. Сейчас попробую выбрать не модифицированную конфу.
Прикрепленные файлы:
72. Sashares 35 23.09.21 17:00 Сейчас в теме
(71)
а именно функцией удалить неиспользуемые строки кода.

ИМХО, особого смысла в этом нет.
Код от подсистем изолирован, он не выполнится и ошибку не даст.
Но если этот код не удалять, то при последующем обновлении БСП не будет лишних отличий.
77. harchenko_pavel 41 23.09.21 21:54 Сейчас в теме
(70)Решил проверить чистую демо конфигурацию БСП на ошибки, синхронные вызовы и модальность, и получил интересный результат, во первых проверка заняла 78 минут, параллельно запущенная проверка моей конфигурации без БСП заняла 6 минут, получается после интеграции, при выполнении определенных сценариев, я не плохо так проиграю в скорости. Во вторых в результате проверки я получил 576 ошибок, разве так должно быть? Еще раз повторюсь, проверяемая конфигурация - это чистая демо конфигурация БСП.

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

Еще смутило, что проверка конфигурации выполняется в основном потоке и наглухо вешает конфигуратор, это относится не к БСП, а к платформе, разве так должен вести себя коммерческий продукт? 78 минут глухого зависания, даже перейти в окно программы нельзя, а загрузка процессора аж 0,7% в один поток....
Прикрепленные файлы:
78. Sashares 35 23.09.21 22:29 Сейчас в теме
(77)
78 минут глухого зависания

Ctrl + Break решает проблему. Но в некоторых версиях платформы может не работать.

(77)
разве так должен вести себя коммерческий продукт?

Обсуждать это здесь и сейчас смысла не вижу. Это не конструктивно, повлиять как-то на это мы не можем.
Это данность, с которой приходится считаться.
Если конфигурация большая, и в ней еще какая-нибудь рег. отчетность, то проверка выполняется долго.
Есть альтернатива конфигуратору - EDT. При этом исходники конфигурации хранятся в git.
В EDT можно сделать свои плагины для проверки или использовать разработанные другими коллегами.
Например вот занятная разработка https://1c-syntax.github.io/bsl-language-server/diagnostics/

(77)
Получается, БСП оптимизирована под ВебКлиент только частично, как так?

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

По поводу ошибок в проверке - что процедура не используется - процедуры с именем "Подключаемый_" - это обработчики событий, которые подключаются программно.

Не все что выглядит ошибкой ей является.
80. harchenko_pavel 41 23.09.21 22:47 Сейчас в теме
(78)
Обсуждать это здесь и сейчас смысла не вижу. Это не конструктивно, повлиять как-то на это мы не можем.
Это данность, с которой приходится считаться.
Согласен, просто я только знакомлюсь с системой и такие моменты вызывают эмоциональный ответ.
Есть альтернатива конфигуратору - EDT. При этом исходники конфигурации хранятся в git.
Неделю как познакомился с этим продуктом, жаль только, что нет поддержки файлов cf и dt и приходится с EDT на конфигуратор и обратно переключаться.
По поводу ошибок в проверке - что процедура не используется - процедуры с именем "Подключаемый_" - это обработчики событий, которые подключаются программно.
Согласен, но есть и реальные ошибки, например:
Обработка.ПанельАдминистрированияБСП.Форма.ИнтернетПоддержкаИСервисы.Справка Неразрешимые ссылки на объекты метаданных (3)

И нет поддержки ВебКлинта в "ОбщийМодуль.РаботаСФайламиСлужебныйКлиент", все вызовы синхронные, например
ОбщийМодуль.РаботаСФайламиСлужебныйКлиент.Модуль Использование синхронного вызова: "Выбрать"

Это все лирика, все равно альтернативы нет, и надо работать с тем что есть, так что вопрос закрываю))
82. Sashares 35 23.09.21 22:51 Сейчас в теме
(80)
Согласен, но есть и реальные ошибки, например:
Обработка.ПанельАдминистрированияБСП.Форма.ИнтернетПоддержкаИСервисы.Справка Неразрешимые ссылки на объекты метаданных (3)


Скорее всего там рассчитано на наличие библиотеки БИП. В любом случае это справка, ошибки в справке будут в любом случае, если встраивать библиотеку не полностью - справку нужно будет править.

И нет поддержки ВебКлинта в "ОбщийМодуль.РаботаСФайламиСлужебныйКлиент", все вызовы синхронные, например
ОбщийМодуль.РаботаСФайламиСлужебныйКлиент.Модуль Использование синхронного вызова: "Выбрать"


Видимо так и есть. Причин подобного решения не скажу. В данный вопрос не вникал.
harchenko_pavel; +1 Ответить
Оставьте свое сообщение