Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования (Linus Torvalds).
вторник, 21 января 2014 г.
понедельник, 20 января 2014 г.
пятница, 17 января 2014 г.
Число прописью
ЧислоПрописью() - это функция встроенного языка.
Она позволяет формировать представление числа прописью в соответствии с форматной строкой и на одном из языков, поддерживаемых платформой. Например, в результате выполнения следующего кода:
Она позволяет формировать представление числа прописью в соответствии с форматной строкой и на одном из языков, поддерживаемых платформой. Например, в результате выполнения следующего кода:
// Пример форматной строки для вывода числа прописью на русском
// языке, с выводом целой и дробной части прописью и выводом
// предмета исчисления.
ФормСтрока = "Л = ru_RU; ДП = Истина";
ПарПредмета="доллар,доллара,долларов,м,цент,цента,центов,м,2";
ПрописьЧисла = ЧислоПрописью(2341.56, ФормСтрока, ПарПредмета);
// Результат вычисления:
// "Две тысячи триста сорок один доллар пятьдесят шесть центов"
// языке, с выводом целой и дробной части прописью и выводом
// предмета исчисления.
ФормСтрока = "Л = ru_RU; ДП = Истина";
ПарПредмета="доллар,доллара,долларов,м,цент,цента,центов,м,2";
ПрописьЧисла = ЧислоПрописью(2341.56, ФормСтрока, ПарПредмета);
// Результат вычисления:
// "Две тысячи триста сорок один доллар пятьдесят шесть центов"
Количество прописью
Для формирования количества прописью можно использовать стандартную функцию, расположенную в общем модуле ФормированиеПечатныхФорм:
// Стандартная для данной конфигурации функция форматирования прописи количества
//
// Параметры:
// Количество - число, которое мы хотим форматировать
//
// Возвращаемое значение:
// Отформатированная должным образом строковое представление количества.
//
Функция КоличествоПрописью(Количество, КодЯзыка = "ru") Экспорт
ЦелаяЧасть = Цел(Количество);
ДробнаяЧасть = Окр(Количество - ЦелаяЧасть, 3);
Если ДробнаяЧасть = Окр(ДробнаяЧасть,0) Тогда
ПараметрыПрописи = ", , , , , , , , 0";
ИначеЕсли ДробнаяЧасть = Окр(ДробнаяЧасть, 1) Тогда
ПараметрыПрописи = НСтр("ru='целая, целых, целых, ж, десятая, десятых, десятых, м, 1';uk='ціла ,цілих ,цілих , ж, десята, десятих, десятих, м, 1'",КодЯзыка);
ИначеЕсли ДробнаяЧасть = Окр(ДробнаяЧасть, 2) Тогда
ПараметрыПрописи = НСтр("ru='целая, целых, целых, ж, сотая, сотых, сотых, м, 2';uk='ціла ,цілих ,цілих , ж, сота, сотих, сотих, м, 2'",КодЯзыка);
Иначе
ПараметрыПрописи = НСтр("ru='целая, целых, целых, ж, тысячная, тысячных, тысячных, м, 3';uk='ціла ,цілих ,цілих , ж, тисячна, тисячних, тисячних, м, 3'",КодЯзыка);
КонецЕсли;
Возврат ЧислоПрописью(Количество,"Л="+Локализация.ОпределитьКодЯзыкаДляФормат(КодЯзыка), ПараметрыПрописи);
КонецФункции // КоличествоПрописью()
//
// Параметры:
// Количество - число, которое мы хотим форматировать
//
// Возвращаемое значение:
// Отформатированная должным образом строковое представление количества.
//
Функция КоличествоПрописью(Количество, КодЯзыка = "ru") Экспорт
ЦелаяЧасть = Цел(Количество);
ДробнаяЧасть = Окр(Количество - ЦелаяЧасть, 3);
Если ДробнаяЧасть = Окр(ДробнаяЧасть,0) Тогда
ПараметрыПрописи = ", , , , , , , , 0";
ИначеЕсли ДробнаяЧасть = Окр(ДробнаяЧасть, 1) Тогда
ПараметрыПрописи = НСтр("ru='целая, целых, целых, ж, десятая, десятых, десятых, м, 1';uk='ціла ,цілих ,цілих , ж, десята, десятих, десятих, м, 1'",КодЯзыка);
ИначеЕсли ДробнаяЧасть = Окр(ДробнаяЧасть, 2) Тогда
ПараметрыПрописи = НСтр("ru='целая, целых, целых, ж, сотая, сотых, сотых, м, 2';uk='ціла ,цілих ,цілих , ж, сота, сотих, сотих, м, 2'",КодЯзыка);
Иначе
ПараметрыПрописи = НСтр("ru='целая, целых, целых, ж, тысячная, тысячных, тысячных, м, 3';uk='ціла ,цілих ,цілих , ж, тисячна, тисячних, тисячних, м, 3'",КодЯзыка);
КонецЕсли;
Возврат ЧислоПрописью(Количество,"Л="+Локализация.ОпределитьКодЯзыкаДляФормат(КодЯзыка), ПараметрыПрописи);
КонецФункции // КоличествоПрописью()
ОбластьМакета.Параметры.ВсегоПрописью = ФормированиеПечатныхФорм.КоличествоПрописью(Всего, "uk");
Убрать лидирующие нули из номера документа
Убрать лидирующие нули из номера документа может нам понадобиться в том случае, если мы, к примеру, формируем печатную форму и номер нужно привести к нормальному виду, не показывая лидирующие нули и префикс документа. Для этого можно воспользоваться готовой процедурой, которая преобразовывает номер к нужному нам виду. Содержится она в общем модуле ОбщегоНазначения:
среда, 15 января 2014 г.
Переопределение процедуры ввода по строке в управляемом приложении
Для того, чтобы определить свой набор данных, которые формируются при вводе по строке нужно использовать событие АвтоПодбор() элемента формы.
Справка из синтаксис-помощника:
АвтоПодбор(<Текст>,
<ДанныеВыбора>, <Ожидание>, <СтандартнаяОбработка>)
Тип: Строка.
Строка текста, введенная в поле ввода.
Тип:
СписокЗначений.
Содержит список значений, который будет использован при стандартной обработке события.
Справка из синтаксис-помощника:
АвтоПодбор (AutoComplete)
Синтаксис:
Параметры:
<Текст>
Строка текста, введенная в поле ввода.
<ДанныеВыбора>
Содержит список значений, который будет использован при стандартной обработке события.
вторник, 14 января 2014 г.
Начало сеанса с информационной базой запрещено. Резервное копирование
При запуске информационной базы выскакивает
окно типа "Ожидание запуска" в нем пишет: Начало сеанса с ИБ запрещено.
Резервное копирование.
Для администратора: для того что бы разблокировать информационную базу, воспользуйтесь консолью кластера серверов или запустите 1С с параметрами: ENTERPRISE/F"C\1cv82\1C\Trade1"/СРазрешитьРаботуПользователей/UC<код разрешения>
Для администратора: для того что бы разблокировать информационную базу, воспользуйтесь консолью кластера серверов или запустите 1С с параметрами: ENTERPRISE/F"C\1cv82\1C\Trade1"/СРазрешитьРаботуПользователей/UC<код разрешения>
Чтобы убрать данную ошибку достаточно удалить 1Cv8.cdn в папке с базой и
все.
пятница, 10 января 2014 г.
Возврат товара от покупателя, если реализация была выполнена на основании заказа
Рассмотрим такой пример:
Покупатель купил 10 единиц товара, через некоторое время он вернул 2 единицы. Вначале был оформлен документ "Заказ покупателя", потом на его основании "Реализация товаров и услуг", для возврата - "Возврат товаров от покупателя" (создан на основании документа реализации). При анализе пользователь обнаружил, что в отчете "Ведомость по заказам покупателей" в колонке "Конечный остаток" для данного товара стоит 2, а также в отчете "Анализ заказов" для данного товара в колонках "Осталось отгрузить", "Осталось обеспечить" стоит цифра 2, а в "Оплата", "Осталось оплатить" - сумма 100 (сумма за 2 единицы товара).
Получается, что организация должна покупателю товар, а он ей деньги...
В данном случае нужно учитывать, что при возврате по реализации сразу же происходит и возврат по заказу и как следствие, система решает, что, если товар не был реализован, значит и заказ не выполнен. Поэтому после возврата нужно делать документ "Закрытие заказов покупателей", указав в комментарии причину "возврат покупателя" и если нужно оформить новый заказ покупателя.
четверг, 9 января 2014 г.
GUID или уникальный идентификатор объекта
GUID (Globally Unique Identifier) - статический уникальный 128-битный идентификатор. Его главная особенность - уникальность, которая позволяет создавать расширяемые сервисы и приложения без опасения конфликтов, вызванных совпадением идентификаторов. Хотя уникальность каждого отдельного GUID не гарантируется, общее количество уникальных ключей настолько велико (2128 или 3,4028×1038), что вероятность того, что в мире будут независимо сгенерированы два совпадающих ключа, крайне мала.
Получить элемент по GUID:
В тексте GUID записывается в виде строки из тридцати двух шестнадцатеричных цифр, разбитой на группы дефисами:
6F9619FF-8B86-D011-B42D-00CF4FC964FF
6F9619FF-8B86-D011-B42D-00CF4FC964FF
Получить GUID элемента можно так:
НоменклатураСсылка = Справочники.Номенклатура.НайтиПоНаименованию("Чайник");
Если НЕ НоменклатураСсылка.Пустая() Тогда
Сообщить("GUID = " + НоменклатураСсылка.УникальныйИдентификатор());
КонецЕсли;
Если НЕ НоменклатураСсылка.Пустая() Тогда
Сообщить("GUID = " + НоменклатураСсылка.УникальныйИдентификатор());
КонецЕсли;
ГУИДВидНоменклатуры = Новый УникальныйИдентфикатор(TypeGUID);
ВидНоменклатуры = Справочники.ВидыНоменклатуры.ПолучитьСсылку(ГУИДВидНоменклатуры);
ВидНоменклатуры = Справочники.ВидыНоменклатуры.ПолучитьСсылку(ГУИДВидНоменклатуры);
понедельник, 6 января 2014 г.
Округление всегда в большую сторону в запросе
Запрос для пересчета количества заказываемого товара в большую сторону, с учетом количества товара содержащимся в одной упаковке.
ВЫБРАТЬ
ЗаказПоставщикуТовары.Номенклатура,
ЗаказПоставщикуТовары.Количество,
ЗаказПоставщикуТовары.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент КАК ЕдиницаХраненияОстатковКоэффициент,
ЗаказПоставщикуТовары.Номенклатура.ЕдиницаДляОтчетов.Коэффициент КАК ЕдиницаДляОтчетовКоэффициент,
ЗаказПоставщикуТовары.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент / ЗаказПоставщикуТовары.Номенклатура.ЕдиницаДляОтчетов.Коэффициент КАК ДоляВУпаковке,
ЗаказПоставщикуТовары.Количество * (ЗаказПоставщикуТовары.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент / ЗаказПоставщикуТовары.Номенклатура.ЕдиницаДляОтчетов.Коэффициент) КАК КоличествоУпаковок
ПОМЕСТИТЬ втЗаказПоставщику
ИЗ
Документ.ЗаказПоставщику.Товары КАК ЗаказПоставщикуТовары
ГДЕ
ЗаказПоставщикуТовары.Ссылка = &Ссылка
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
втЗаказПоставщику.Номенклатура,
втЗаказПоставщику.Количество,
втЗаказПоставщику.ЕдиницаХраненияОстатковКоэффициент,
втЗаказПоставщику.ЕдиницаДляОтчетовКоэффициент,
втЗаказПоставщику.ДоляВУпаковке,
втЗаказПоставщику.КоличествоУпаковок,
ВЫРАЗИТЬ(втЗаказПоставщику.КоличествоУпаковок - 0.5 КАК ЧИСЛО(10, 0)) КАК ЧислоЦелыхЧастей,
втЗаказПоставщику.Количество - втЗаказПоставщику.ЕдиницаДляОтчетовКоэффициент * (ВЫРАЗИТЬ(втЗаказПоставщику.КоличествоУпаковок - 0.5 КАК ЧИСЛО(10, 0))) КАК ОстатокЦелого
ПОМЕСТИТЬ втЗаказПоставщикуУпаковка
ИЗ
втЗаказПоставщику КАК втЗаказПоставщику
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
втЗаказПоставщикуУпаковка.Номенклатура,
втЗаказПоставщикуУпаковка.Количество,
втЗаказПоставщикуУпаковка.ЕдиницаХраненияОстатковКоэффициент,
втЗаказПоставщикуУпаковка.ЕдиницаДляОтчетовКоэффициент,
втЗаказПоставщикуУпаковка.ДоляВУпаковке,
втЗаказПоставщикуУпаковка.КоличествоУпаковок,
втЗаказПоставщикуУпаковка.ЧислоЦелыхЧастей,
втЗаказПоставщикуУпаковка.ОстатокЦелого,
ВЫБОР
КОГДА втЗаказПоставщикуУпаковка.ОстатокЦелого = 0
ТОГДА втЗаказПоставщикуУпаковка.ЧислоЦелыхЧастей
ИНАЧЕ втЗаказПоставщикуУпаковка.ЧислоЦелыхЧастей + 1
КОНЕЦ * втЗаказПоставщикуУпаковка.ЕдиницаДляОтчетовКоэффициент КАК КоличествоСУчетомУпаковки
ИЗ
втЗаказПоставщикуУпаковка КАК втЗаказПоставщикуУпаковка
ЗаказПоставщикуТовары.Номенклатура,
ЗаказПоставщикуТовары.Количество,
ЗаказПоставщикуТовары.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент КАК ЕдиницаХраненияОстатковКоэффициент,
ЗаказПоставщикуТовары.Номенклатура.ЕдиницаДляОтчетов.Коэффициент КАК ЕдиницаДляОтчетовКоэффициент,
ЗаказПоставщикуТовары.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент / ЗаказПоставщикуТовары.Номенклатура.ЕдиницаДляОтчетов.Коэффициент КАК ДоляВУпаковке,
ЗаказПоставщикуТовары.Количество * (ЗаказПоставщикуТовары.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент / ЗаказПоставщикуТовары.Номенклатура.ЕдиницаДляОтчетов.Коэффициент) КАК КоличествоУпаковок
ПОМЕСТИТЬ втЗаказПоставщику
ИЗ
Документ.ЗаказПоставщику.Товары КАК ЗаказПоставщикуТовары
ГДЕ
ЗаказПоставщикуТовары.Ссылка = &Ссылка
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
втЗаказПоставщику.Номенклатура,
втЗаказПоставщику.Количество,
втЗаказПоставщику.ЕдиницаХраненияОстатковКоэффициент,
втЗаказПоставщику.ЕдиницаДляОтчетовКоэффициент,
втЗаказПоставщику.ДоляВУпаковке,
втЗаказПоставщику.КоличествоУпаковок,
ВЫРАЗИТЬ(втЗаказПоставщику.КоличествоУпаковок - 0.5 КАК ЧИСЛО(10, 0)) КАК ЧислоЦелыхЧастей,
втЗаказПоставщику.Количество - втЗаказПоставщику.ЕдиницаДляОтчетовКоэффициент * (ВЫРАЗИТЬ(втЗаказПоставщику.КоличествоУпаковок - 0.5 КАК ЧИСЛО(10, 0))) КАК ОстатокЦелого
ПОМЕСТИТЬ втЗаказПоставщикуУпаковка
ИЗ
втЗаказПоставщику КАК втЗаказПоставщику
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
втЗаказПоставщикуУпаковка.Номенклатура,
втЗаказПоставщикуУпаковка.Количество,
втЗаказПоставщикуУпаковка.ЕдиницаХраненияОстатковКоэффициент,
втЗаказПоставщикуУпаковка.ЕдиницаДляОтчетовКоэффициент,
втЗаказПоставщикуУпаковка.ДоляВУпаковке,
втЗаказПоставщикуУпаковка.КоличествоУпаковок,
втЗаказПоставщикуУпаковка.ЧислоЦелыхЧастей,
втЗаказПоставщикуУпаковка.ОстатокЦелого,
ВЫБОР
КОГДА втЗаказПоставщикуУпаковка.ОстатокЦелого = 0
ТОГДА втЗаказПоставщикуУпаковка.ЧислоЦелыхЧастей
ИНАЧЕ втЗаказПоставщикуУпаковка.ЧислоЦелыхЧастей + 1
КОНЕЦ * втЗаказПоставщикуУпаковка.ЕдиницаДляОтчетовКоэффициент КАК КоличествоСУчетомУпаковки
ИЗ
втЗаказПоставщикуУпаковка КАК втЗаказПоставщикуУпаковка
пятница, 3 января 2014 г.
Назначить конкретный тип элементу формы, который связан с реквизитом формы, имеющим составной тип
Для этого можно присвоить реквизиту формы значение пустой ссылки нужного типа. Одного из тех типов, которые входят в составной тип.
Например, для поля ввода, связанного с реквизитом, который может принимать значение ссылки на справочники физических и юридических лиц, назначение нужного типа может выглядеть следующим образом:
Если запретить выбор типа в поле ввода (свойство ВыбиратьТип), то реквизиту ОтветЛицо будет назначен тип ссылки на справочник ФизическиеЛица, и для выбора будут предлагаться значения только этого справочника.
Также можно использовать свойство поля ввода ОграничениеТипа, задающее возможные типы данных, которые могут быть введены в поле ввода, и приводить значение соответствующего реквизита к нужному типу:
Например, для поля ввода, связанного с реквизитом, который может принимать значение ссылки на справочники физических и юридических лиц, назначение нужного типа может выглядеть следующим образом:
Объект.ОтветЛицо = ПредопределенноеЗначение("Справочник.ФизическиеЛица.ПустаяСсылка");
Если запретить выбор типа в поле ввода (свойство ВыбиратьТип), то реквизиту ОтветЛицо будет назначен тип ссылки на справочник ФизическиеЛица, и для выбора будут предлагаться значения только этого справочника.
Также можно использовать свойство поля ввода ОграничениеТипа, задающее возможные типы данных, которые могут быть введены в поле ввода, и приводить значение соответствующего реквизита к нужному типу:
Массив = Новый Массив();
Массив.Добавить(Тип("СправочникСсылка.ФизическиеЛица"));
НашеОписание = Новый ОписаниеТипов(Массив);
Элементы.ОтветЛицо.ОграничениеТипа = НашеОписание;
Объект.ОтветЛицо = НашеОписание.ПривестиЗначение(Объект.ОтветЛицо);
Массив.Добавить(Тип("СправочникСсылка.ФизическиеЛица"));
НашеОписание = Новый ОписаниеТипов(Массив);
Элементы.ОтветЛицо.ОграничениеТипа = НашеОписание;
Объект.ОтветЛицо = НашеОписание.ПривестиЗначение(Объект.ОтветЛицо);
Программно очистить реквизит в форме
Для того чтобы очистить реквизит в форме, следует присвоить этому реквизиту значение по умолчанию.
Например, для реквизита Контрагент имеющего тип СправочникСсылка.Контрагенты фрагмент кода будет выглядеть следующим образом:
Например, для реквизита Контрагент имеющего тип СправочникСсылка.Контрагенты фрагмент кода будет выглядеть следующим образом:
Объект.Контрагент = ПредопределенноеЗначение("Справочник.Контрагенты.ПустаяСсылка");
Получить предопределенное значение на клиенте
Т.к. обращение к менеджерам объектов (например, Справочники.<Имя справочника>) на клиенте недоступно, то для получения ссылки на предопределенное значение на клиенте следует использовать метод глобального контекста ПредопределенноеЗначение(). Например, требуется открыть форму предопределенного элемента справочника. Это можно сделать с помощью следующего кода:
&НаКлиенте
Процедура СоздатьСобытие(Команда)
ВидСобытия = ПредопределенноеЗначение("Справочник.ВидыСобытий.Встреча");
ОткрытьЗначение(ВидСобытия);
КонецПроцедуры
Процедура СоздатьСобытие(Команда)
ВидСобытия = ПредопределенноеЗначение("Справочник.ВидыСобытий.Встреча");
ОткрытьЗначение(ВидСобытия);
КонецПроцедуры