Реализация чата на 1С 8,3 (Управляемые формы)

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

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

Чат

49
Детальное описание реализации небольшого чата для пользователей.
                Возможности:
                - Сортировка пользователей по статусу
                - Количество новых сообщений
                - Раскраска окна сообщений
                - Все на управляемых формах
                - RSA шифрование
Используемые источники:
//infostart.ru/
http://smbsec.ru/1cpredpriyatie/primer-assimetrichnogo-shifrovaniyarsa-1spredpriyatie-8.html

И так приступим…. Вся реализация будет описана на чистой конфигурации.

                Первоначально научим 1С работать с пользователями.

Для этого нам понадобится:

- «Справочник.Пользователи»

(Код, Наименование (100), ПолноеНаименование - Строка 150,ИдентификаторПользователяИБ - Уникальный идентификатор)

Параметр сеанса - «ТекущийПользователь»  (Справочник ссылка пользователи)

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


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

//*********************************************************************************

Процедура ОпределитьТекущегоПользователя () Экспорт
	Если ПользователиИнформационнойБазы.ПолучитьПользователей().Количество()=0
		Тогда
		ТекстСообщенияОбОшибке = "Пользователи информационной базы не определены!";
		ВызватьИсключение ТекстСообщенияОбОшибке;
	Иначе
		ТекущийПользовательИБ 		= ПользователиИнформационнойБазы.ТекущийПользователь();
		ИдентификаторПользователяИБ = ТекущийПользовательИБ.УникальныйИдентификатор;
		
		ТекущийПользователь = Справочники.Пользователи.НайтиПоРеквизиту(
		"ИдентификаторПользователяИБ",ИдентификаторПользователяИБ);
		Если ТекущийПользователь.Пустая() Тогда
			НовыйПользователь = Справочники.Пользователи.СоздатьЭлемент();
			НовыйПользователь.ИдентификаторПользователяИБ = ИдентификаторПользователяИБ;
			НовыйПользователь.Наименование				  = ТекущийПользовательИБ.Имя;
			НовыйПользователь.ПолноеНаименование		  = ТекущийПользовательИБ.ПолноеИмя;
			НовыйПользователь.Записать();
			ТекущийПользователь = НовыйПользователь.Ссылка;
		КонецЕсли;
		ПараметрыСеанса.ТекущийПользователь = ТекущийПользователь;
	КонецЕсли;	
КонецПроцедуры
//*********************************************************************************

//*********************************************************************************
Функция ТекущийПользователь () Экспорт
	Возврат ПараметрыСеанса.ТекущийПользователь;
КонецФункции	
//*********************************************************************************

//*********************************************************************************
Функция ПолучитьПользователейИБ (ТолькоИдентификаторы) Экспорт
	Если ТолькоИдентификаторы = 1 Тогда	
		Массив = новый Массив;
		Массив = ПользователиИнформационнойБазы.ПолучитьПользователей();	
		МассивИдентификаторв = Новый Массив;
		Для Каждого ЭлементМассива Из Массив Цикл
			МассивИдентификаторв.Добавить(ЭлементМассива.УникальныйИдентификатор);	
		КонецЦикла;
		Возврат МассивИдентификаторв;
	Иначе  
		Возврат  ПользователиИнформационнойБазы.ПолучитьПользователей();
	КонецЕсли;	
КонецФункции
//*********************************************************************************

//*********************************************************************************
Функция ВернутьПользователйИзСправочника () Экспорт
	Массив = Новый Массив;
	Массив = ПолучитьПользователейИБ (1);
	Запрос = Новый Запрос;
	Запрос.Текст =  "ВЫБРАТЬ
	|	Пользователи.Ссылка,
	|	Пользователи.ИдентификаторПользователяИБ
	|ИЗ
	|	Справочник.Пользователи КАК Пользователи
	|ГДЕ
	|	Пользователи.ИдентификаторПользователяИБ В(&Пользователи)
	|
	|УПОРЯДОЧИТЬ ПО
	|	Пользователи.Наименование";
	
	Запрос.УстановитьПараметр("Пользователи",Массив);
	Выборка =  Запрос.Выполнить().Выбрать();
	МассивПользователейИзСпр = Новый Массив;
	Пока Выборка.Следующий() Цикл
		Стр = Новый Структура ("Пользователь, УИД");
		Стр.Вставить("Пользователь",Выборка.Ссылка);
		Стр.Вставить("УИД",Выборка.ИдентификаторПользователяИБ);
		МассивПользователейИзСпр.Добавить(Стр);
	КонецЦикла;
	Возврат МассивПользователейИзСпр;
КонецФункции
//*********************************************************************************

//*********************************************************************************
Функция ВернутьСтатусПользователя(УИДПользователяИБ) Экспорт
	Массив = Новый Массив;
	Для Каждого Элемент ИЗ ПолучитьСоединенияИнформационнойБазы() Цикл
		Массив.Добавить(Элемент.Пользователь.УникальныйИдентификатор);	
	КонецЦикла;
	
	Если Массив.Найти(УИДПользователяИБ)<> Неопределено Тогда
		Возврат 1
	Иначе
		Возврат 2
	КонецЕсли;
КонецФункции
//*********************************************************************************

Создадим регистр сведений для сообщений


«Отправитель, Адресат» - СправочникСсылка.Пользователи

«Текст» - Строка

«Прочтено» - Булево



Так же создадим две строковые константы для хранения ключей шифрования:



Обе константы строковые неограниченно длинны.

Создадим еще один общий модуль для работы с RSAшифрованием.


Код модуля

//********************************************************************************************
//http://smbsec.ru/1cpredpriyatie/primer-assimetrichnogo-shifrovaniyarsa-1spredpriyatie-8.html
//Внимание! Приведенная информация распространяется исключительно в ознакомительных целях.
//Перед использованием данных материалов рекомендуется ознакомиться с ФЗ Российской Федерации
//от 4 мая 2011 г. N 99-ФЗ "О лицензировании отдельных видов деятельности".
//Обработка является примером работы с RSA из 1С:Предприятие 
//и выполняет для примера шифрование и расшифрование текста.
//********************************************************************************************


Функция СтрокаВДвоичныйВид(ВходнаяСтрока) Экспорт
	Поток = Новый COMОбъект("ADODB.Stream");
	Поток.Open();
	Поток.Type = 2;
	Поток.Charset = "utf-8";
	Поток.WriteText(ВходнаяСтрока);
	
	Поток.Position = 0;
	Поток.Type = 1;
	
	ДвоичныеДанные = Поток.Read(-1);
	
	Поток.Close();
	Поток = Неопределено;
	Возврат ДвоичныеДанные;
КонецФункции

Функция ДвоичныеДанныеВстроку(ДвоичныеДанные) Экспорт
	Поток = Новый COMОбъект("ADODB.Stream");
	Поток.Open();
	Поток.Type = 1;
	
	Поток.Write(ДвоичныеДанные);
	Поток.Position = 0;
	Поток.Type = 2;
	Поток.Charset = "utf-8";
	ВыхСтр = Поток.ReadText(-1);
	Поток.Close();
	Поток = Неопределено;
	Возврат ВыхСтр;
КонецФункции

Функция ДвоичныеДанныеВBase64(bin) Экспорт
	ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
	Поток = Новый COMОбъект("ADODB.Stream");
	Поток.Open();
	Поток.Type = 1;
	Поток.Write(bin);
	Поток.SaveToFile(ИмяВременногоФайла, 1);
	Поток.Close();
	Поток = Неопределено;
	ДвоичныеДанные = Новый ДвоичныеДанные(ИмяВременногоФайла);
	УдалитьФайлы(ИмяВременногоФайла);
	Возврат Base64Строка(ДвоичныеДанные);
КонецФункции

Функция Base64ВДвоичныеДанные(ВхСтрока) Экспорт
	
	ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
	ДвоичныеДанные = Base64Значение(ВхСтрока);
	ДвоичныеДанные.Записать(ИмяВременногоФайла);
	
	Поток = Новый COMОбъект("ADODB.Stream");
	Поток.Open();
	Поток.Type = 1;
	Поток.LoadFromFile(ИмяВременногоФайла);
	ДвоичныеДанные = Поток.Read(-1);
	Поток.Close();
	Поток = Неопределено;
	
	УдалитьФайлы(ИмяВременногоФайла);
	Возврат ДвоичныеДанные;
	
КонецФункции

Функция Зашифровать(СтрокаДляШифрования)  Экспорт
	ОбъектШифрования = Новый COMОбъект("System.Security.Cryptography.RSACryptoServiceProvider");
	//Инициализация объект RSA, используя данные ключа из строки XML.
	//http://msdn.microsoft.com/ru-ru/library/system.security.cryptography.rsa.fromxmlstring.aspx
	ОбъектШифрования.FromXmlString(Константы.RSA_ПубличныйКлюч.Получить());
	//преобразование строки для шифрования в двоичный вид
	ИсхТекстДвоичн = СтрокаВДвоичныйВид(СтрокаДляШифрования);
	//шифруем
	ЗашифрованныйТекстДвоичн = ОбъектШифрования.Encrypt(ИсхТекстДвоичн, False);
	//преобразование зашифрованных данных в Base64
	ЗашифрованныйТекстСтр = ДвоичныеДанныеВBase64(ЗашифрованныйТекстДвоичн);
	Возврат ЗашифрованныйТекстСтр;
КонецФункции

Функция Расшифровать(ЗашифрованнаяСтрока) Экспорт
	ОбъектШифрования = Новый COMОбъект("System.Security.Cryptography.RSACryptoServiceProvider");
	ОбъектШифрования.FromXmlString(Константы.RSA_ПубличныйИПриватныйКлюч.Получить());
	ЗашифрованныйТекстДвоичн2 = Base64ВДвоичныеДанные(ЗашифрованнаяСтрока);
	РасшифрованныйТекстДвоичн = ОбъектШифрования.Decrypt(ЗашифрованныйТекстДвоичн2, False);
	//преобразование расшифрованных данных в строку
	РасшифрованныйТекстСтр = ДвоичныеДанныеВстроку(РасшифрованныйТекстДвоичн);
	Возврат  РасшифрованныйТекстСтр;	
	ОбъектШифрования = Неопределено;
КонецФункции

Процедура ПроверитьRSAКлючи()Экспорт
//генерируем новый приватный и публичный ключи
//в рабочей версии ключи требуется раздать пользователям и хранить
Если (Константы.RSA_ПубличныйИПриватныйКлюч.Получить()="") И (Константы.RSA_ПубличныйКлюч.Получить()="") Тогда
RSA_Шифрование.RSAСоздатьКлючи("","");		
КонецЕсли; 
КонецПроцедуры

Процедура RSAСоздатьКлючи(КлючШифрования, КлючШифрованияИРасшифрования) Экспорт
	//http://msdn.microsoft.com/ru-ru/library/system.security.cryptography.rsa.toxmlstring.aspx	
	ОбъектКриптографии				= Новый COMОбъект("System.Security.Cryptography.RSACryptoServiceProvider");
	КлючШифрования					= ОбъектКриптографии.ToXmlString(False);
	КлючШифрованияИРасшифрования 	= ОбъектКриптографии.ToXmlString(True);
	Константы.RSA_ПубличныйИПриватныйКлюч.Установить(КлючШифрованияИРасшифрования);
	Константы.RSA_ПубличныйКлюч.Установить(КлючШифрования);
	ОбъектКриптографии 				= Неопределено;
КонецПроцедуры




На этом подготовительная часть закончилась. Переходим к созданию обработки по отправки и приему сообщений.




Модуль формы

//*********************************************************************************
&НаКлиенте
Процедура ПриОткрытии(Отказ)
	Обновить ();
	RSA_Шифрование.ПроверитьRSAКлючи();
	ПодключитьОбработчикОжидания ("Обновить",10);
КонецПроцедуры
//*********************************************************************************

//*********************************************************************************
&НаКлиенте
Процедура Обновить ()
	Тз.Очистить();	
	Массив = Новый Массив;
	Массив = РаботаСПользователями.ВернутьПользователйИзСправочника();

	МассивСообщений = Новый Массив;
	МассивСообщений = ВернутьНепрочитанныеСообщения (РаботаСПользователями.ТекущийПользователь());
	Для Каждого ЭлементМассива ИЗ Массив Цикл
		Если ЭлементМассива.Пользователь = РаботаСПользователями.ТекущийПользователь() Тогда
			Продолжить
		КонецЕсли;	
		СтрТЗ = ТЗ.Добавить();	
		СтрТз.Пользователь = ЭлементМассива.Пользователь;
		Статус = РаботаСПользователями.ВернутьСтатусПользователя(ЭлементМассива.УИД);
		
		Если Статус = 1 Тогда
			СтрТЗ.Статус = "OnLine"; 
		Иначе
			СтрТЗ.Статус = "OffLine";
		КонецЕсли;
		
		Для Каждого Сообщение ИЗ МассивСообщений Цикл
			Если Сообщение.Отправитель = ЭлементМассива.Пользователь Тогда
				СтрТз.Сообщения = Сообщение.Количество;
			КонецЕсли;	
		КонецЦикла
	КонецЦикла;
	ТЗ.Сортировать("Статус Убыв, Пользователь Возр");
КонецПроцедуры
//*********************************************************************************

//*********************************************************************************
&НаСервере
Функция ВернутьНепрочитанныеСообщения (Получатель)
	Запрос = Новый Запрос;
	Запрос.Текст =   "ВЫБРАТЬ
	|	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Сообщения.Период) КАК Количество,
	|	Сообщения.Отправитель
	|ИЗ
	|	РегистрСведений.Сообщения КАК Сообщения
	|ГДЕ
	|	Сообщения.Адресат = &amp;Адресат
	|	И Сообщения.Прочтено = ЛОЖЬ
	|
	|СГРУППИРОВАТЬ ПО
	|	Сообщения.Отправитель" ;
	Запрос.УстановитьПараметр("Адресат",Получатель);
	Выборка = Запрос.Выполнить().Выбрать();
	МассивСообщений = Новый Массив;
	Пока Выборка.Следующий() Цикл
		Ст = Новый Структура ("Отправитель,Количество");
		Ст.Вставить("Отправитель",Выборка.Отправитель);
		Ст.Вставить("Количество",Выборка.Количество);
		МассивСообщений.Добавить(Ст);
	КонецЦикла;
	Возврат МассивСообщений;	 
КонецФункции
//*********************************************************************************

//*********************************************************************************
&НаКлиенте
Процедура ТЗВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	// Вставить содержимое обработчика.
	СтандартнаяОбработка = Ложь;
	Адресат = Элементы.ТЗ.ТекущиеДанные.Пользователь;
	П = Новый Структура ("Адресат",Адресат);
	ФормаСообщений = ОткрытьФормуМодально ("Обработка.Чат.Форма.ФормаОтправкиСообщения",П);
КонецПроцедуры




На данной форме поле сообщения - это поле HTMLдокумента, для того чтобы раскрасить наш чат.


Модуль формы:

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

//*********************************************************************************
&НаСервере
Процедура ЗаписатьОтвет (ДанныеДляЗаполнения)
	МенеджерЗаписей  = РегистрыСведений.Сообщения.СоздатьМенеджерЗаписи();
	МенеджерЗаписей.Период = ДанныеДляЗаполнения.Период;
	МенеджерЗаписей.Адресат = ДанныеДляЗаполнения.Адресат;
	МенеджерЗаписей.Отправитель = ДанныеДляЗаполнения.Отправитель;
	МенеджерЗаписей.Текст = RSA_Шифрование.Зашифровать(ДанныеДляЗаполнения.Текст);
	МенеджерЗаписей.Прочтено = Ложь;
	МенеджерЗаписей.Записать();
КонецПроцедуры
//*********************************************************************************

//*********************************************************************************
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	//Для того чтобы получить логическую цепочку сообщений 	
	//Заполним массив отправитель адресат
	Адресат = Параметры.Адресат;
	Массив = Новый Массив;
	Массив.Добавить(Адресат);
	Массив.Добавить(РаботаСпользователями.ТекущийПользователь());
	
	Запрос = Новый Запрос;
	Запрос.Текст =     "ВЫБРАТЬ ПЕРВЫЕ 10
	|	Сообщения.Текст,
	|	Сообщения.Период КАК Период,
	|	Сообщения.Отправитель,
	|	Сообщения.Адресат
	|ИЗ
	|	РегистрСведений.Сообщения КАК Сообщения
	|ГДЕ
	|	Сообщения.Отправитель В (&amp;Отправитель)
	|	И Сообщения.Адресат В (&amp;Адресат)
	|
	|УПОРЯДОЧИТЬ ПО
	|	Период Возр";
	
	Запрос.УстановитьПараметр("Отправитель",Массив);
	Запрос.УстановитьПараметр("Адресат",Массив);
	Выборка = Запрос.Выполнить().Выбрать();
	
	Текст = Новый ТекстовыйДокумент;
	Текст.ДобавитьСтроку("<!DOCTYPE html> <html>");
	
	Пока Выборка.Следующий() Цикл
		МенеджерЗаписи = РегистрыСведений.Сообщения.СоздатьМенеджерЗаписи();
		ЗаполнитьЗначенияСвойств(МенеджерЗаписи,Выборка);
		МенеджерЗаписи.Прочитать();
		Если МенеджерЗаписи.Выбран() Тогда
			МенеджерЗаписи.Прочтено = Истина;
			МенеджерЗаписи.Записать();
		КонецЕсли; 
		
		Если Выборка.Отправитель = РаботаСПользователями.ТекущийПользователь() Тогда
			Стр = "<font size=""3"" color=""red"" face=""Calibri"">""" +Строка(Выборка.Отправитель)+" "+Строка(Выборка.Период)+"</font>" + "<br>";
			Текст.ДобавитьСтроку(Стр);
			Стр = "<font size=""3"" color=""Black"" face=""Calibri"">""" +RSA_Шифрование.Расшифровать(Строка(Выборка.Текст))+"</font>" + "<br>";
			Текст.ДобавитьСтроку(Стр);
		Иначе 
			Стр = "<font size=""3"" color=""Blue"" face=""Calibri"">""" +Строка(Выборка.Отправитель)+" "+Строка(Выборка.Период)+"</font>" + "<br>";
			Текст.ДобавитьСтроку(Стр);
			Стр = "<font size=""3"" color=""Black"" face=""Calibri"">""" +RSA_Шифрование.Расшифровать(Строка(Выборка.Текст))+"</font>" + "<br>";
			Текст.ДобавитьСтроку(Стр);
		КонецЕсли; 	
	КонецЦикла;
	
	Текст.ДобавитьСтроку("</html>");
	ИмяВременногоФайла = ПолучитьИмяВременногоФайла("html");
	Текст.Записать(ИмяВременногоФайла);
	Сообщения = ИмяВременногоФайла;
	
КонецПроцедуры
//*********************************************************************************


Получается примерно следующее:



Регистр с сообщениями выглядит:



Как видно из скринов, сообщения зашифрованы нашими RSA Ключами.





49

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

Комментарии
Избранное Подписка Сортировка: Древо
1. seermak 660 09.09.14 12:10 Сейчас в теме
Интересно, но - если ключей еще нет то после создания ключей продолжение процедуры дает ошибку в этой строке("ОбъектШифрования.FromXmlString(Константы.RSA_ПубличныйКлюч.Получить());" Еще перепутаны в форме с ТЗ (пользователи) = Адресат = Элементы.Пользователи.ТекущиеДанные; - здесь напутано в именах
2. iolko 234 10.09.14 02:41 Сейчас в теме
(1) seermak, Доброго дня, действительно были недочеты, спасибо, что вовремя указали. Исправил, внес корректировки в код. Отправил на модерацию. Так же добавил скрины того что в итоге получается.
3. sashocq 191 18.09.14 10:15 Сейчас в теме
Выглядит как-то сыровато. Сделать только простенький чат — дело не хитрое. Тут, конечно, фишка в шифровании. Но в данной реализации оно выглядит неуместным. У нас рядом в базе лежит регистр с зашифрованными сообщениями и тут же в константах открытый и закрытый ключи (секретностью тут не пахнет). Если бы обмен сообщениями осуществлялся между разными базами — это можно было бы понять, а так нет. Если вы хотите сделать чат внутри одной базы между разными пользователями с шифрованием, то у каждого пользователя должен быть свой закрытый ключ, который не передается на сервер.
К тому же, в платформе есть механизмы для работы с криптографией. Хотелось бы реализации с их использованием. Ну, или как-то прокомментировать, почему нет (в статье про это ни слова).
Итогом, если статью назвать «как шифровать в 1С через COM», то пойдет, а с текущим заголовком — не зачет.
4. seermak 660 18.09.14 17:03 Сейчас в теме
(3) да дело здесь скорее не в самом чате - + за то, что подвинул на изучение криптографии на таком простом примере))
5. DragEugen 24.09.14 14:15 Сейчас в теме
спасибо сподвигли на изучение криптографии в 1с
6. hazd 05.10.14 23:57 Сейчас в теме
что-то подобное на данном ресурсе уже встречалось,
7. maksa2005 296 23.10.14 08:32 Сейчас в теме
Особено актуально, когда на работе запрещено устанавливать icq
8. informa1555 1142 01.11.14 08:07 Сейчас в теме
Интересная статья, но визуально выглядит не очень. Я делал на СКД полностью чат вот в этой разработке http://infostart.ru/public/309075/
9. lampa24111986 20.09.16 13:38 Сейчас в теме
{ОбщийМодуль.RSA_Шифрование.Модуль(80)}: Ошибка при вызове метода контекста (FromXmlString)
ОбъектШифрования.FromXmlString(Константы.RSA_ПубличныйКлюч.Получить());
по причине:
Произошла исключительная ситуация (mscorlib): Недопустимый синтаксис в строке 1.
10. lampa24111986 20.09.16 14:19 Сейчас в теме
Странно, всё сделал. В обработке главную форму ставлю - "Форма"
Затем когда открываю обработку, в колонке "Пользователь" выбираю пользователя, которому хочу отправить сообщение и ничего не происходит, вторая форма не открывается, чтоб отправить сообщение.
11. iolko 234 21.09.16 12:23 Сейчас в теме
(10) lampa24111986, Доброго дня. Если честно, чтобы понять в чем проблема нужно смотреть проблему целиком. Так ответить не готов. Вроде бы где то оставались исходники, если нужно могу выслать.
12. lampa24111986 21.09.16 17:13 Сейчас в теме
(11) Если Вам не сложно, то хотелось бы их получить. Вот моя почта lampa241186@rambler.ru
13. user721310 06.04.17 11:11 Сейчас в теме
(11) Я столкнулся с такой же проблемой, не могли бы вы скинуть исходник, если он у вас еще остался в живых.
14. iolko 234 07.04.17 06:07 Сейчас в теме
15. user1030389 15.08.18 10:38 Сейчас в теме
Здравствуйте, у меня такая же проблема(10) , не осталось ли исходников у вас?
16. iolko 234 19.08.18 19:07 Сейчас в теме
17. palkor 22.08.18 13:01 Сейчас в теме
(16) поделитесь со мной тоже (palkor@list.ru) Буду очень признателен. Вероятно, на сайте не измененный код, исходный. У меня "проблемы" аналогичные вышеописанным.

И огромное спасибо, что даете возможность изучать то, что не "лежит на поверхности" :)
18. palkor 22.08.18 13:26 Сейчас в теме
(16), к сообщению (17)
Вот, например:
{ОбщийМодуль.RSA_Шифрование.Модуль(71)}: Ошибка при вызове метода контекста (FromXmlString)
ОбъектШифрования.FromXmlString(Константы.RSA_ПубличныйКлюч.Получить());
по причине:
Произошла исключительная ситуация (mscorlib): Недопустимый синтаксис в строке 1.

???
21. user1030389 30.08.18 14:10 Сейчас в теме
(18) А в этом случае не правильно заполнен ключ
28. stash_84 26.08.19 07:44 Сейчас в теме
(16) Добрый день! Если исходники ещё живы, то был бы рад, если скинете на почту stash_84@mail.ru
20. user1030389 29.08.18 10:41 Сейчас в теме
Может быть кому-то будет полезно: ошибки с выбором пользователя и открытием формы (10) возникают из-за того, что процедуры выбора, при открытии и тд. не привязаны к форме.
19. user1030389 23.08.18 13:51 Сейчас в теме
22. user1080794 01.11.18 12:00 Сейчас в теме
Доброго времени суток! Если остался исходник, не могли бы вы поделиться (v.aleksandra1204@gmail.com). Заранее благодарна:)
23. 1c_nik923 07.11.18 13:43 Сейчас в теме
Алексей доброго времени, тоже был бы рад исходникам (mr.petrachuk@mail.ru). Заранее спасибо ))
24. Sympho 08.11.18 15:09 Сейчас в теме
И мне, если не сложно. klavadez@gmail.com
25. user1109053 15.02.19 17:06 Сейчас в теме
Пришлите, пожалуйста и мне, если Вас не затруднит: doktor_kkk@mail.ru
26. Petrm 7 03.03.19 07:05 Сейчас в теме
Доброго дня, Алексей, если остался исходник, не могли бы вы поделиться и выслать на почту petrm@list.ru
27. Nefilimus 59 11.05.19 11:55 Сейчас в теме
Можно пожалуйста исходники? Выдаёт ошибки (( m.novruzov161@gmail.com
Оставьте свое сообщение

См. также

Полезные процедуры и функции для программиста 115

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

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

07.10.2019    6224    HostHost    22       

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

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

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

05.09.2019    10282    ids79    42       

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

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

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

03.09.2019    7893    YPermitin    68       

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

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

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

17.08.2019    8476    ids79    14       

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

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

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

08.08.2019    10686    ids79    24       

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

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

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

02.08.2019    9939    avalakh    21       

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

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

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

26.07.2019    9578    ids79    6       

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

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

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

17.07.2019    8877    ids79    24       

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

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

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

04.07.2019    6282    SeiOkami    48       

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

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

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

25.06.2019    17669    ids79    17       

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

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

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

11.06.2019    11615    dmurk    134       

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

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

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

16.05.2019    17351    YPermitin    27       

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

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

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

11.05.2019    9955    Eret1k    22       

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

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

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

25.04.2019    4885    m-rv    2       

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

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

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

16.04.2019    7429    m-rv    16       

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

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

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

07.04.2019    16465    ellavs    122       

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

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

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

28.03.2019    12808    ellavs    83       

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

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

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

14.03.2019    12913    YPermitin    52       

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

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

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

03.02.2019    15627    ids79    9       

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

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

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

26.12.2018    12787    ids79    27       

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

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

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

14.12.2018    21573    ids79    72       

Чат на управляемых формах 9

Отчеты и формы Программист Пользователь Конфигурация (md, cf) v8 v8::УФ Абонемент ($m) Практика программирования WEB

Чат для 1С на управляемых формах, для работы в браузере. Возможности: Есть общая комната Можно создавать открытые и закрытые комнаты Переписка между двумя пользователями (беседа) Протестировано на платформе 8.3.12.1714.

2 стартмани

14.12.2018    3201    6    panihinnv    13       

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

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

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

16.11.2018    18998    ids79    20       

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

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

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

13.11.2018    19850    Unk92    18       

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

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

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

10.11.2018    20941    ids79    40       

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

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

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

15.10.2018    20551    tormozit    100       

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

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

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

03.09.2018    14647    nikita0832    41       

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

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

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

23.08.2018    21395    Rain88    42       

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

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

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

25.06.2018    19367    olegtymko    47       

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

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

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

04.06.2018    24502    xrrg    82       

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

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

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

01.06.2018    21252    m-rv    21       

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

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

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

23.05.2018    17036    slozhenikin_com    19       

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

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

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

13.05.2018    11397    Rustig    9       

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

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

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

24.04.2018    24556    avfed@rambler.ru    19       

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

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

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

19.02.2018    35722    ildarovich    44       

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

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

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

11.12.2017    25910    milkers    23       

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

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

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

05.12.2017    21361    itriot11    34       

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

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

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

19.11.2017    138011    MaxS    251       

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

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

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

01.11.2017    22762    slava_1c    49       

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

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

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

30.10.2017    21120    unichkin    18       

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

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

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

29.10.2017    24097    json    9       

Работа с Excel 289

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

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

23.10.2017    24865    arakelyan    39