Примеры кода

makfromkz
Сообщения: 480
Зарегистрирован: Чт май 25, 2017 11:56 am

Re: Примеры кода

Сообщение makfromkz » Вс сен 24, 2017 12:10 pm

Создание флажков в табличном поле взято тут: http://www.1c1c1c.ru/index.php?option=c ... &Itemid=30

Руководство по созданию рабочих флажков в табличном поле:
1. размещаем в диалоге элемент табличное поле и НЕ создаем никаких колонок интерактивно.
2. в модуле пишем:

Код: Выделить всё

 //обработчик события элемента формы Табличное поле ПриВыводеСтроки
Процедура СписокЗагрузкиПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
    ОформлениеСтроки.Ячейки.Флаг.ОтображатьФлажок=Истина;
    ОформлениеСтроки.Ячейки.Флаг.Флажок=Ложь;
КонецПроцедуры

ТЗ=Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Флажок", Новый ОписаниеТипов("Булево"));
ТЗ.Колонки.Добавить("КодТовара");
ТЗ.Колонки.Добавить("Наименование");
ТЗ.Колонки.Добавить("ЦенаПартнера");
ТЗ.Колонки.Добавить("РекомендованнаяЦена");
ТЗ.Колонки.Добавить("ЦенаРеализации");

ЭлементыФормы.СписокЗагрузки.Значение=ТЗ;
ЭлементыФормы.СписокЗагрузки.СоздатьКолонки();
ЭлементыФормы.СписокЗагрузки.Колонки.Флажок.ДанныеФлажка="Флажок";
ЭлементыФормы.СписокЗагрузки.Колонки.Флажок.Данные="";
ЭлементыФормы.СписокЗагрузки.Колонки.Флажок.ТолькоПросмотр=Ложь;
ЭлементыФормы.СписокЗагрузки.Колонки.Флажок.РежимРедактирования=РежимРедактированияКолонки.Непосредственно;

makfromkz
Сообщения: 480
Зарегистрирован: Чт май 25, 2017 11:56 am

Re: Примеры кода

Сообщение makfromkz » Вс сен 24, 2017 9:32 pm

Получение даты, зная день недели и его порядок в месяце источник: https://infostart.ru/public/672632/

Код: Выделить всё

// Функция - Получить день недели в месяце
//
// Параметры:
//  Неделя		- Число - Порядковый номер недели в месяце (1, 2, 3, 4)
//  ДеньНедели		- Число - День недели, где 1 - Понедельник, ..., 7 - Воскресенье
//  ЗаданнаяДатаМесяца	- Дата	- Дата месяца, для которой необходимо получить дату дня
// 
// Возвращаемое значение:
// Дата - Если она существует или Неопределено
//
Функция ПолучитьДеньНеделиВМесяце(Неделя, ДеньНедели, ЗаданнаяДатаМесяца)
	
	Результат = Неопределено;
	
	ПервыйДеньМесяца = НачалоМесяца(ЗаданнаяДатаМесяца); 		// 11.09.17 - > 01.09.17
	ПервыйДеньНеделиМесяца = ДеньНедели(ПервыйДеньМесяца);		// 01.09.17 - > 5 (Пятница)
	СмещениеДняНеделиМесяца = ДеньНедели - ПервыйДеньНеделиМесяца;	// 1 - 5 = -4 (Смещение для понедельника)
	
	Если СмещениеДняНеделиМесяца < 0 Тогда
		СмещениеДняНеделиМесяца = 7 + СмещениеДняНеделиМесяца; // если получили отрицательное значение, то прибавляем неделю  7-4=3
	КонецЕсли; 
	
	ИскомаяДатаДня = 7*(Неделя-1) + СмещениеДняНеделиМесяца + 1; // Находим день 7*(1-1) + 3 + 1 = 4 
	
	Попытка
		Результат = Дата(Год(ЗаданнаяДатаМесяца), Месяц(ЗаданнаяДатаМесяца), ИскомаяДатаДня); // Пытаемся преобразовать
	Исключение
	    Результат = Неопределено; // такой даты не существует (Например 7ой понедельник месяца)
	КонецПопытки;
	
	Возврат Результат;
		
КонецФункции

makfromkz
Сообщения: 480
Зарегистрирован: Чт май 25, 2017 11:56 am

Re: Примеры кода

Сообщение makfromkz » Ср окт 25, 2017 11:14 am

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

Код: Выделить всё

ВЫБРАТЬ
	Товары.Наименование КАК Наименование
ИЗ
	Справочник.Номенклатура КАК Товары
ГДЕ
	Товары.Ссылка В
			(ВЫБРАТЬ
				РасхНаклСостав.Номенклатура
			ИЗ
				Документ.РеализацияТоваровУслуг.Товары КАК РасхНаклСостав
			ГДЕ
				РасхНаклСостав.Номенклатура = Товары.Ссылка)
Еще примеры использования коррелированных запросов:
Задача:
Как получить последние два курса по валютам?

Код: Выделить всё

ВЫБРАТЬ
	КурсыВалютСрезПоследних.Валюта КАК Валюта,
	КурсыВалютСрезПоследних.Период КАК ПоследняяДата,
	КурсыВалют.Период КАК ПредпоследняяДата,
	КурсыВалютСрезПоследних.Курс КАК ПоследнийКурс,
	КурсыВалют.Курс КАК ПредпоследнийКурс
ИЗ
	РегистрСведений.КурсыВалют.СрезПоследних КАК КурсыВалютСрезПоследних
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют
		ПО ((КурсыВалют.Валюта, КурсыВалют.Период) В
				(ВЫБРАТЬ
					КурсыВалют.Валюта,
					МАКСИМУМ(КурсыВалют.Период) КАК Период
				ИЗ
					РегистрСведений.КурсыВалют КАК КурсыВалют
				ГДЕ
					КурсыВалют.Период < КурсыВалютСрезПоследних.Период
					И КурсыВалют.Валюта = КурсыВалютСрезПоследних.Валюта
				СГРУППИРОВАТЬ ПО
					КурсыВалют.Валюта))

makfromkz
Сообщения: 480
Зарегистрирован: Чт май 25, 2017 11:56 am

Re: Примеры кода

Сообщение makfromkz » Ср авг 15, 2018 10:19 am

Перевод Макроса в код 1С

Код: Выделить всё

Процедура КнопкаВыполнитьНажатие(Кнопка)
	ТекстовыйДокумент = Новый ТекстовыйДокумент;
	ТекстовыйДокумент.ДобавитьСтроку(КодМакроса);
	ДопСтрока = Новый ТекстовыйДокумент;
	Для Н = 1 По ТекстовыйДокумент.КоличествоСтрок() Цикл 
		СтрокаСкодом = ТекстовыйДокумент.ПолучитьСтроку(Н);
		с1 = Символ(034); с2 = Символ(034) + Символ(034);
		Буф = СтрЗаменить(СтрокаСкодом,с1,с2); //заменяем на двойные чтоб 1С понимала  
		Если Не ПустаяСтрока(Буф) Тогда //если перевелённая строка не пустая то записываем предварительный код
			ДопСтрока.ДобавитьСтроку(Буф); //предварительно заполняем код для 1С
		КонецЕсли; 
	КонецЦикла;
	
	//продолжаем переводить код
	КодДля1С = ЭлементыФормы.КодДля1С;
	КодДля1С.ДобавитьСтроку("Ехсел = Новый COMОбъект(""Excel.Application"");");
	КодДля1С.ДобавитьСтроку("Книга = Ехсел.Workbooks.Add;");
	КодДля1С.ДобавитьСтроку("MR = Книга.VBProject;");
	КодДля1С.ДобавитьСтроку("NM = MR.VBComponents.Add(1);");
	КолСтрокСКодом = ДопСтрока.КоличествоСтрок();
	Для Н = 1 По КолСтрокСКодом Цикл 
		КодДля1С.ДобавитьСтроку("NM.CodeModule.InsertLines(" + Н + "," + Символ(034) + ДопСтрока.ПолучитьСтроку(Н) + Символ(034)+");");
	конеццикла;
КонецПроцедуры

makfromkz
Сообщения: 480
Зарегистрирован: Чт май 25, 2017 11:56 am

Функция РасчетНОД

Сообщение makfromkz » Пт сен 21, 2018 10:54 am

Функция РасчетНОД (Число1, Число2). взято тут: https://infostart.ru/public/84419
возвращает Наибольший Общий Делитель двух чисел.

Код: Выделить всё

Функция РасчетНОД (Число1, Число2) Экспорт
  Если Число1 >= Число2 Тогда
    Первое = Число1;
    Второе = Число2;
  Иначе
    Первое = Число2;
    Второе = Число1;
  КонецЕсли;
  Остаток = Первое % Второе;
  Если Остаток > 0 Тогда
    Первое = Второе;
    Второе = Остаток;
    НОД = РасчетНОД(Первое, Второе);
  Иначе
    НОД = Второе;
  КонецЕсли;
  Возврат НОД;
КонецФункции
Обратите внимание: используется рекурсия

makfromkz
Сообщения: 480
Зарегистрирован: Чт май 25, 2017 11:56 am

Re: Примеры кода

Сообщение makfromkz » Сб фев 23, 2019 2:52 pm

1С. Чтение XML
взято тут: http://wiki.programstore.ru/1s-chtenie-xml/
Сегодня мы с вами рассмотрим несколько способов реализации часто встречающейся задачи, которая неизменно вызывает определенные трудности у каждого начинающего программиста, а именно разбор XLS файлов.

«Какая уж тут сложность?!! Берешь Com объект Excel.Application, наискосок пробегаешь по методичке MSDN Microsoft и готово!» — воскликнет один из наших более опытных коллег, уже успевший сваять две нетленки и раскурочить до неузнаваемости типовую УПП. А сложность есть, и она в неопределенности доступных ресурсов. Расшифруем эту красивую фразу чуть подробнее.

Предположим, что у нас все хорошо (нет) и сервером является что-то вроде Windows Server 2013 R2 (далее просто Win). И на нем даже установлен Microsoft Office. Или, будь не к ночи помянута, у нас файловая база.
В этом случае все очень просто:

Код: Выделить всё

Создаем EA = ComObject(«Excel.Application”);
Открываем книгу

Код: Выделить всё

Книга = EA.Worlbooks.Open(ПолныйПутьКФайлу);
Получаем нужный лист

Код: Выделить всё

Лист = Книга.WorkSheets(ИмяНужногоЛиста);
Теперь можно работать, как с обычным табличным документам при помощи метода

Код: Выделить всё

Лист.Range(х,y);
Не забываем, что область заполненных данных мы можем определить через методы

Код: Выделить всё

Лист.Cells.SpecialCells(11).Column
и

Код: Выделить всё

Лист.Cells.SpecialCells(11).Row


Не забываем убирать за собой, а именно делать корректные обработки ошибки, и в случае возникновения оных закрывать подключение к COM объекту, иначе рискуем получить заблокированный документ и сотни сеансов Excel на сервере:

Код: Выделить всё

Книга.Close();

EA.Application.Quit;


Априори утверждать, что на сервере будет установлена какая-либо версия Excel, нельзя. Особенно во времена, когда по организациям ходят мужчины в строгих костюмах и просят предъявить лицензионное соглашение на все, включая пасьянс на компьютере секретаря.
Тем не менее сервера на Win довольно-таки распространенная вещь. Допустим у нас именно такой, а вот на лицензионный Office денег не хватило.
В этом случае допустим следующий метод – чтение файла через драйвер Ado.
Стоит отдельно заметить, что это один из наиболее быстрых способов чтения файлов Excel.

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

Код: Выделить всё

АДО = Новый COMОбъект(«ADODB.Connection»);

АДО.ConnectionString =  «Provider=Microsoft.Jet.OLEDB.4.0;Data Source= «  + ПолныйПутьКФайлу + «;Extended Properties=»»Excel 8.0;HDR=YES;IMEX=1;»»»;

 АДО.Open();
А вот далее идет … запрос. Да, мы будем читать данные файла запросом, как данные любой другой базы данных.

Код: Выделить всё

РС = Новый COMОбъект("ADODB.Recordset");

ТекстЗапроса = «SELECT * FROM [« + ИмяНужногоЛиста + «$]»

РС.Open(ТекстЗапроса, АДО);
Чтение Recordset’а выполняется в цикле. Условием завершения цикла является значение, возвращаемое методом РС.EOF();

Перебор набора – методом РС. MoveNext();

Количество колонок и строк, хранится в свойствах РС.RecordCount и РС.Fields.Count. Не забываем, что это не методы, и следовательно скобки не нужны.

Позиционирование на конкретной ячейке документа — РС.Fields.Item(НомерКолонки).



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

Код: Выделить всё

РС.Close();

 АДО.Close();

 РС = Неопределено;

 АДО = Неопределено;

DeleteWorld();
Есть еще один вариант, сервер на WIn и OpenOffice. Такое сочетание встречается чуть менее, чем повсеместно в гос.конторах и прочих бюджетных учреждениях. Его, я конечно, же не буду рассматривать(с).
На самом деле, этот метод абсолютно уступает чтению через ADO, как в быстродействии, так и простое построения алгоритмов.
В случае, если сервер развернут на Linux единственный вариант – это через использование стандартного 1Совского ЧтенияXML(ну или ПостроительDOM, для гурманов). Так же данные метод применим только для «соверменного» формата XLSX. Устаревший XLS таким образом прочитать не получится. Но не унывайте, есть решение и на этот случай (см.пункт 5)Дело в том, что файл формат XLSX это фактически архив, в котором хранятся XML файлы и служебные таблицы, так же в формате XML.
Строковые, численные и прочие примитивные значения ячеек в файле xl\sharedStrings.xml

Формулы в файле xl\ calcChain.xml

Разметки листов в xl\worksheets\sheetsX.xml

Оформления листов в файле xl\styles.xml

Указанные файлы можно прочитать при помощи объекта ЧтениеXML или более продвинутого ПостроительDOM.
В любом случае структура этих файлов достаточно сложна и достойна отдельной статьи. Так же с ней можно ознакомиться самостоятельно, просто открыв файл XLSX любым архиватором.

На сладкое оставим способ, доступный если у вас платформа 8.6.3 или старше.
Разработчики 1С позаботились о тех, несчастных, которым недоступна технология COM, ADO или приходится работать с устаревшим XLS.

Для этого для метода Прочитать() ТабличногоДокумента добавили параметр

СпособЧтенияЗначений типа СпособЧтенияЗначенийТабличногоДокумента.

Таким образом можно «скормить» файл табличному документу, а затем работать с ним.

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

Код: Выделить всё

ПостроительЗапросов = Новый ПостроительЗапроса;

ПостроительЗапросов.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабличныйДокумент.Область());

ПостроительЗапросов.Выполнить();

ТаблицаЗначений = ПостроительЗапросов.Результат.Выгрузить();
И получить ТаблицуЗначений здорового человека, с которой справится и вчерашний студент.



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

makfromkz
Сообщения: 480
Зарегистрирован: Чт май 25, 2017 11:56 am

Re: Примеры кода

Сообщение makfromkz » Пт окт 04, 2019 4:08 pm

Как вычислить разность разность дат взято с http://1c-1c.ru/poleznaya-informatsiya/ ... e-zametki/

Код: Выделить всё

// Процедура вычисляет количество лет, месяцев и дней между двумя датами
//
// Параметры
// Дата1 – дата, первая дата (более поздняя, часто текущая, стаж определяется по состоянию на эту дату)
// Дата2 – дата, вторая дата (ранняя дата, с нее начинается «течение» стажа)
// Лет – Число, в этот параметр будет записано кол-во лет между двумя датами (Дата1-Дата2)
// Месяцев – Число, в этот параметр будет записано кол-во месяцев между двумя датами (Дата1-Дата2)
// Дней – Число, в этот параметр будет записано кол-во дней между двумя датами (Дата1-Дата2)
//
Процедура РазобратьРазностьДат(Дата1, Дата2, Лет = 0, Месяцев = 0, Дней = 0) Экспорт

Лет = 0;
Месяцев = 0;
Дней = 0;
Если Дата1 > Дата2 Тогда

ВременнаяДата = Дата1;
Если День(ВременнаяДата) < День(Дата2) Тогда
Дней = (ВременнаяДата — ДобавитьМесяц(ВременнаяДата,-1))/86400;
ВременнаяДата = ДобавитьМесяц(ВременнаяДата,-1);
КонецЕсли;
Если Месяц(ВременнаяДата) < Месяц(Дата2) Тогда
ВременнаяДата = ДобавитьМесяц(ВременнаяДата,-12);
Месяцев = 12;
КонецЕсли;
Лет = Макс( Год(ВременнаяДата) — Год(Дата2), 0);
Месяцев = Макс(Месяцев + Месяц(ВременнаяДата) — Месяц(Дата2), 0);
Дней = Макс(Дней + День(ВременнаяДата) — День(Дата2), 0);

// скорректируем отображаемое значение, если «вмешалось» разное количество дней в месяцах
Если Дата2 <> (ДобавитьМесяц(Дата1,-Лет*12-Месяцев)-Дней*86400) Тогда
Дней = Дней + ((ДобавитьМесяц(Дата1,-Лет*12-Месяцев)-Дней*86400) — Дата2)/86400;
//(День(КонецМесяца(Дата2)) — День(НачалоМесяца(Дата2))) — (День(КонецМесяца(ДобавитьМесяц(Дата1,-1))) — День(НачалоМесяца(ДобавитьМесяц(Дата1,-1))));
КонецЕсли;

КонецЕсли;

КонецПроцедуры // РазобратьРазностьДат

makfromkz
Сообщения: 480
Зарегистрирован: Чт май 25, 2017 11:56 am

Re: Примеры кода

Сообщение makfromkz » Пн окт 07, 2019 4:42 pm

Узнать доступную роль на константу.
взято тут: http://1cdlasebya.blogspot.com/2013/09/blog-post.html

Код: Выделить всё

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

makfromkz
Сообщения: 480
Зарегистрирован: Чт май 25, 2017 11:56 am

Re: Примеры кода

Сообщение makfromkz » Пн окт 07, 2019 4:57 pm

1С Запрос по не уникальным кодам справочника.
взято тут: http://1cdlasebya.blogspot.com/2014/03/1_31.html
Показывает кол-во не уникальных кодов:

Код: Выделить всё

ВЫБРАТЬ
    ДоговорыКонтрагентов.Код КАК Код,
    ДоговорыКонтрагентов.Ссылка,
    1 КАК НеУникальных
ИЗ
    Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов

УПОРЯДОЧИТЬ ПО
    НеУникальных УБЫВ
ИТОГИ
    СУММА(НеУникальных)
ПО
    Код

Администратор
Site Admin
Сообщения: 53
Зарегистрирован: Чт май 25, 2017 11:44 am

Re: Примеры кода

Сообщение Администратор » Сб окт 26, 2019 10:14 am

Пример функции по чтению xls-файла в 1С8

Код: Выделить всё

&НаКлиенте
Функция мПрочитатьТабличныйДокументИзExcel(ИмяФайла, НомерЛистаExcel = 1) Экспорт
	
	xlLastCell = 11;
	ВыбФайл = Новый Файл(ИмяФайла);
	Если НЕ ВыбФайл.Существует() Тогда
		Сообщить("Файл не существует!");
		Возврат Ложь;
	КонецЕсли;
	Попытка
		Excel = Новый COMОбъект("Excel.Application");
		Excel.WorkBooks.Open(ИмяФайла);
		Сообщить("Обработка файла Microsoft Excel...");
		ExcelЛист = Excel.Sheets(НомерЛистаExcel);
	Исключение
		Сообщить("Ошибка. Возможно неверно указан номер листа книги Excel.");
		Возврат ложь;
		
	КонецПопытки;
	Excel.Visible = 1;
	ActiveCell = Excel.ActiveCell.SpecialCells(xlLastCell);
	RowCount = ActiveCell.Row;
	ColumnCount = ActiveCell.Column;
	Для Column = 1 По ColumnCount Цикл
		ТаблДок1.Область("C" + Формат(Column, "ЧГ=")).ШиринаКолонки = ExcelЛист.Columns(Column).ColumnWidth;
	КонецЦикла;
	Для Row = 1 По RowCount Цикл
		Для Column = 1 По ColumnCount Цикл
			ТаблДок1.Область("R" + Формат(Row, "ЧГ=") +"C" + Формат(Column, "ЧГ=")).Текст = ExcelЛист.Cells(Row,Column).Text;
		КонецЦикла;
	КонецЦикла;
	Excel.Quit();
	Excel = 0;
	Возврат Истина;
	
КонецФункции // ()

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость