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

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

1С Дополнительные реквизиты на форме при помощи расширения

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

1) Выносим в расширение документ документ «Реализация товаров и добавляем реквизит «ПокупкаССайта» в реквизиты формы. Да! именно в реквизиты формы, а не документа. В настоящий момент платформа 1С не дает добавлять в расширения реквизиты документа (но обещают). Перетаскиваем реквизит в элементы и обязательно ставим галочку на «АктивизироватьПоУмолчанию» — иначе на форме при запуске не отобразится:

2) Следующая задача — сделать сохранение значения данного реквизита с привязкой к документы. Самое удобное — хранить значение в специально предназначенном для этого регистре ДополнительныеРеквизитыИСведения. В нём два измерения: обьект и Свойство. Обьект в нашем случае — это документ Реализации, а свойство нужно задать в ПланеВидовХарактеристик.ДополнительныеРеквизитыИСведения. Например так:

  

И далее создадим обработчики открытия формы и закрытия в которых реализуем чтение из регистра и запись в этот регистр:

&НаСервере
Функция ЗаписатьЗначениеПокупкиССайта(параметр)	
		МенеджерЗаписи = РегистрыСведений.ДополнительныеСведения.СоздатьМенеджерЗаписи();
		МенеджерЗаписи.Объект = объект.Ссылка;
		МенеджерЗаписи.Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Продажа с сайта");		
		МенеджерЗаписи.Значение=параметр;
		МенеджерЗаписи.Записать();	
конецфункции

&НаСервере
Функция ПолучитьЗначениеГалочки();
	зн=РегистрыСведений.ДополнительныеСведения.СоздатьНаборЗаписей();
	отбор=зн.Отбор;
	отбор.Объект.Установить(объект.Ссылка);
	отбор.Свойство.Установить(ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Продажа с сайта"));		
	зн.Прочитать();	
	галочка=ложь;
	для каждого стр из зн   цикл
		галочка=стр.Значение;
	конеццикла;
	возврат галочка;
КонецФункции  	
&НаКлиенте
Процедура Расш1_ПровестиИзФормыПосле(Команда)
ЗаписатьЗначениеПокупкиССайта(этаформа.ПокупкаССайта);
КонецПроцедуры

&НаКлиенте
Процедура Расш1_ПровестиИЗакрытьИзФормыПосле(Команда)
	Расш1_ПровестиИзФормыПосле(Команда);
КонецПроцедуры

&НаКлиенте
Процедура Расш1_ПриОткрытииПосле(Отказ)
	этаформа.ПокупкаССайта=ПолучитьЗначениеГалочки();
КонецПроцедуры

После обновления 1С Бухгалтерии до 3.0.71.63, стала появляться ошибка «Ошибка выделения памяти»:

Лечение (один из методов должен помочь):

  1. Перезагрузка, сервера 1С предприятие и сервера MSSQL
  2. Установка 64битной версии платформы 1С
  3. Ограничение использования памяти MSSQL до реально установленных в сервер
  4. Обновить платформу

1C выбор из списка на управляемой форме

Задача: организовать на форме выбор из списка, с первоначальным заполнением из запроса

Решение:

1. Создаем на форме реквизит, с типом «Список значений» и обьектом — СправочникСсылка.Склады:

2. Создаем событие формы «При создании на сервере» и заполняем список:

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

    Пока Выборка.Следующий() Цикл
        СписокСкладов.Добавить(Выборка.Ссылка,Выборка.Представление);
    КонецЦикла;	
КонецПроцедуры

Получаем результат вида:

1С: передача файла с клиента на сервер, управляемое приложение

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

&НаКлиенте
Процедура ЗагрузитьSonex()
	
	БинарныйФайл = Новый ДвоичныеДанные(Объект.ИмяФайла);
	сообщить("-помещаем во временное хранилище");
	АдресВХ = ПоместитьВоВременноеХранилище(БинарныйФайл,ЭтаФорма.УникальныйИдентификатор);	
	ОбработатьНодХМЛНаСервере(АдресВХ,объект.ГруппаЗагрузки);
	
	сообщить("-ок");
	
КонецПроцедуры

&НаСервере
Процедура ОбработатьНодХМЛНаСервере(АдресВХ,владелец);
	сообщить(АдресВХ);
	ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВХ);
	
	тПуть = "c:\temp\pricesonix.xml"; //для примера...
	ДвоичныеДанные.Записать(тПуть);	
	
	ЧтениеХ=Новый ЧтениеXML;
	ЧтениеХ.ОткрытьФайл(тПуть);	
КонецПроцедуры

 

Аналог case..swith в 1С

Вот такую конструкцию в 1С можно считать аналогом  операторов case…swith в других языках:

если ст.Параметр="Изготовитель" тогда
										обсп.Брэнд=ст.Значение;
									ИначеЕсли ст.Параметр="Страна" тогда
										обсп.Страна=ст.Значение;
									иначе	
										нс=обсп.Характеристики.Добавить();
										нс.Наименование=ст.Параметр;
										нс.Значение=ст.Значение;									
									конецесли;