Архив рубрики: 1C

Разработки на платформе 1С

1С Чтение CSV

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

Вот нормальный рабочий код:

	//создаем таблицу, в которую будут записаны данные из файла
	Таблица = новый ТаблицаЗначений;

	// чтение
	сообщить("--читаем файл "+тПуть);
	ЗагружаемыйФайл = Новый ТекстовыйДокумент;
	ЗагружаемыйФайл.Прочитать(тПуть); // ИмяФайла - путь к файлу на диске
	сообщить("--ок");
	//Формируем шапку таблицы. Шапка по умолчанию первая строчка
	сообщить("--получаем шапку");
	Шапка = ЗагружаемыйФайл.ПолучитьСтроку(1);
	сообщить("--ок");

	//раскладываем стрoку в массив Разделителем колонок в данном случае является точка с запятой
	МассивКол = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Шапка, ";");

	//генерируем столбцы
	сообщить("--генерируем столбцы таблицы");
	Для Каждого ИмяСтолбца Из МассивКол Цикл
	  ИмяБезПробелов = СтрЗаменить(ИмяСтолбца," ",""); // убираем из имени пробелы
	  Таблица.Колонки.Добавить(ИмяБезПробелов,,ИмяСтолбца);
	КонецЦикла;
	сообщить("--ок");
	
	сообщить("--загружаем файл в таблицу");
	Для НомерСтроки=2 по ЗагружаемыйФайл.КоличествоСтрок() Цикл
		// получить стрoку с указанным номером и преобразуем её в массив
		Строка = ЗагружаемыйФайл.ПолучитьСтроку(НомерСтроки);
		МассивКол = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Строка,";");
		НоваяСтрочка= Таблица.Добавить();

		Для НомерСтолбца= 1 по МассивКол.Количество() Цикл //заполняем строчку значениями
			ТекущееЗначение = МассивКол[НомерСтолбца-1];
			ИмяКолонки = Таблица.Колонки[НомерСтолбца-1].Имя;
			НоваяСтрочка[ИмяКолонки] = ТекущееЗначение;
		КонецЦикла;
	КонецЦикла;	
	сообщить("--ок");

P.S. Тем кто изначально разместил такой не рабочий код, посылаю лучи ненависти. Тоже тупил наверное минут 15.

Даунгрейт платформы 1С

Бывает так, что обновил платформу, а что-то пошло не так. И нужно вернуть «всё как было». Засада в этот раз подкралась когда удалил обновлённую платформу: перестал стартовать Агент сервера в службах. При внимательном изучении — оказалось что служба пыталась стартовать новый агент, который уже удален. Гугл подсказал, что проблема решается перерегистрацией службы:

ragent.exe -instsrvc

Все способы определения не заданной даты в 1С

В текстах модулей

  1. Если Дата = ‘00010101Тогда
  2. Если Дата = ‘00010101000000Тогда
  3. Если Дата = ‘00010101Тогда
  4. Если Дата = Дата(1, 1, 1) Тогда
  5. Если Дата = Дата(1, 1, 1, 0, 0, 0) Тогда
  6. Если Не ЗначениеЗаполнено(Дата) Тогда

В запросах

  1. ГДЕ Дата = ДАТАВРЕМЯ(0001,01,01,0,0,0)
  2. ГДЕ Дата = ДАТАВРЕМЯ(1,1,1)
  3. ГДЕ Дата = &ПустаяДата 

Запрос.УстановитьПараметр(«ПустаяДата«, ‘00010101‘);

1С: Прикрепляемые файлы к документу

Задача: организовать прикрепление и хранение файлов в документе. Желательно используя «штатный велосипед» 1С.

Решение:

Всё зависит от БСП на основе которой построена Ваша конфигурация. В моем случае, конфигурация Бухгалтерия 3.0.75.100, БСП 3.1.25

Узнать версию БСП можно при помощи:

Сообщить(СтандартныеПодсистемыСервер.ВерсияБиблиотеки());

Далее если есть подписка на ИТС, читаем тут или если нет, то у меня 😉

1) Чтобы ручками не заполнять все реквизиты, копируем справочник «ПередачаТоваровПрисоединенныеФайлы», копию переименовываем в <ИмяМоегоДокумента>ПрисоединенныеФайлы. В моем случае документ носит имя «Абоненты». Далее на скриншотах и в тексте я его так и буду называть. В Вашем случае это будет Ваш справочник/документ.

В реквизите «ВладелецФайла» указываем наш документ

2) В состав определяемых типов ПрисоединенныйФайл (ссылки) и ПрисоединенныйФайлОбъект (объекты) добавим наш документ:

3) Включить в состав плана обмена ОбновлениеИнформационнойБазы

4) Добавить источники у подписк и «ПереопределитьПолучаемуюФормуПрисоединенногоФайла» и «УстановитьПометкуУдаленияПрисоединенныхФайловДокументов»

5) Добавить в состав определяемых типов ВладелецПрисоединенныхФайлов (ссылки) и ВладелецПрисоединенныхФайловОбъект (объекты)

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

  • Добавить реквизит формыМожноЗакрытьФормуСФайламитипа Булево.
  • В обработчике формыПередЗакрытиемвставить вызов процедуры ПоказатьПодтверждениеЗакрытияФормыСФайлами общего модуля РаботаСФайламиКлиент по шаблону:
&НаКлиенте
Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
    РаботаСФайламиКлиент.ПоказатьПодтверждениеЗакрытияФормыСФайлами(ЭтотОбъект, Отказ, Объект.Ссылка);
КонецПроцедуры
  • Другой код, который необходимо выполнять в обработчикеПередЗакрытием, следует размещать после вызова процедуры и проверки параметраОтказ. Например:
&НаКлиенте
Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
    РаботаСФайламиКлиент.ПоказатьПодтверждениеЗакрытияФормыСФайлами(ЭтотОбъект, Отказ, Объект.Ссылка);
    Если Отказ Тогда
        Возврат;
    КонецЕсли;
    <другой код...>
КонецПроцедуры

Результат: появившаяся «скрепочка» и список файлов по её нажатии.

Всё хорошо, одно плохо. Не понятно как это всё будет себя вести при обновлении. Предполагаю что галочки эти нужно будет расставлять каждый раз.

1С: Выбор адреса в форме документа

Исходные данные: 1С Бухгалтерия 3.0.75.100, платформа 8.3.16.1063

В одной из задач, понадобилось вбивать валидный адрес (на основе КЛАДР) в одно из полей документа. Было принято решения использовать для этого стандартный функционал 1С.

Результат работы будет выглядеть как-то так:

Итак, последовательность работ:

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

2) В документе создаем табличную часть «Контактная информация» (можно скопировать например из справочника «Торговые точки»)

3) На форме документа располагаем пустую группу с именем «ГруппаКонтактнаяИнформация»

4) В модуль формы копируем:

// СтандартныеПодсистемы.КонтактнаяИнформация

&НаКлиенте
Процедура Подключаемый_КонтактнаяИнформацияПриИзменении(Элемент)
	УправлениеКонтактнойИнформациейКлиент.НачатьИзменение(ЭтотОбъект, Элемент);
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_КонтактнаяИнформацияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	УправлениеКонтактнойИнформациейКлиент.НачатьВыбор(ЭтотОбъект, Элемент, , СтандартнаяОбработка);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_КонтактнаяИнформацияПриНажатии(Элемент, СтандартнаяОбработка)
	УправлениеКонтактнойИнформациейКлиент.НачатьВыбор(ЭтотОбъект, Элемент,, СтандартнаяОбработка);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_КонтактнаяИнформацияОчистка(Элемент, СтандартнаяОбработка)
	УправлениеКонтактнойИнформациейКлиент.НачатьОчистку(ЭтотОбъект, Элемент.Имя);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_КонтактнаяИнформацияВыполнитьКоманду(Команда)
	УправлениеКонтактнойИнформациейКлиент.НачатьВыполнениеКоманды(ЭтотОбъект, Команда.Имя);
КонецПроцедуры

&НаСервере
Процедура ОбновитьКонтактнуюИнформацию(Результат)		
	УправлениеКонтактнойИнформацией.ОбновитьКонтактнуюИнформацию(ЭтотОбъект, Объект, Результат);

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

&НаКлиенте
Процедура Подключаемый_ПродолжитьОбновлениеКонтактнойИнформации(Результат, ДополнительныеПараметры) Экспорт
	
	ОбновитьКонтактнуюИнформацию(Результат);
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_КонтактнаяИнформацияАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
	
	УправлениеКонтактнойИнформациейКлиент.АвтоПодборАдреса(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка);
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_КонтактнаяИнформацияОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
	
	УправлениеКонтактнойИнформациейКлиент.ОбработкаВыбора(ЭтотОбъект, ВыбранноеЗначение, Элемент.Имя, СтандартнаяОбработка);
	
КонецПроцедуры

&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)

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

&НаСервере
Процедура ПриЗакрытииНаСервере()	
	Адрес = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(Объект.Ссылка,Справочники.ВидыКонтактнойИнформации.АдресТочкиПодключения);
	если Адрес<>"" тогда
		об=Документы.Абоненты.НайтиПоНомеру(объект.Номер).ПолучитьОбъект();		
		об.АдресПодключения=Адрес;
		об.Записать();
		объект.АдресПодключения=Адрес;			
	конецесли;	
КонецПроцедуры

&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
	ПриЗакрытииНаСервере();
КонецПроцедуры

// Конец СтандартныеПодсистемы.КонтактнаяИнформация