вторник, 21 января 2014 г.

Данные были изменены или удалены другим пользователем (тонкий клиент)

Если при попытке записать элемент справочника или документ появляется ошибка "Данные были изменены или удалены другим пользователем", то это значит, что данные, которые отображаются на форме и данные, которые записаны в базе отличаются.


понедельник, 20 января 2014 г.

Новая методика проведения документа в 1С 8.2

Рассмотрим новую методику проведения на платформе 8.2.  Для этого возьмем демо- конфигурацию "Управляемое приложение" и рассмотрим методику проведения документа "РасходТовара", который делает движения по регистру "ТоварныеЗапасы".

пятница, 17 января 2014 г.

Число прописью

ЧислоПрописью() - это функция встроенного языка.
Она позволяет формировать представление числа прописью в соответствии с форматной строкой и на одном из языков, поддерживаемых платформой. Например, в результате выполнения следующего кода:

// Пример форматной строки для вывода числа прописью на русском
// языке, с выводом целой и дробной части прописью и выводом
// предмета исчисления.
ФормСтрока = "Л = ru_RU; ДП = Истина";
ПарПредмета="доллар,доллара,долларов,м,цент,цента,центов,м,2";
ПрописьЧисла = ЧислоПрописью(2341.56, ФормСтрока, ПарПредмета);

// Результат вычисления:
// "Две тысячи триста сорок один доллар пятьдесят шесть центов"


Количество прописью

Для формирования количества прописью можно использовать стандартную функцию, расположенную в общем модуле ФормированиеПечатныхФорм:

// Стандартная для данной конфигурации функция форматирования прописи количества
//
// Параметры:
//  Количество - число, которое мы хотим форматировать
//
// Возвращаемое значение:
//  Отформатированная должным образом строковое представление количества.
//
Функция КоличествоПрописью(Количество, КодЯзыка = "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<код разрешения>


 Чтобы убрать данную ошибку достаточно удалить 1Cv8.cdn в папке с базой и все.

пятница, 10 января 2014 г.

Возврат товара от покупателя, если реализация была выполнена на основании заказа

Рассмотрим такой пример:
Покупатель купил 10 единиц товара, через некоторое время он вернул 2 единицы. Вначале был оформлен документ "Заказ покупателя", потом на его основании "Реализация товаров и услуг", для возврата - "Возврат товаров от покупателя" (создан на основании документа реализации). При анализе пользователь обнаружил, что в отчете "Ведомость по заказам покупателей" в колонке "Конечный остаток" для данного товара стоит 2, а также в отчете "Анализ заказов" для данного товара в колонках "Осталось отгрузить",  "Осталось обеспечить" стоит цифра 2, а в "Оплата", "Осталось оплатить" - сумма 100 (сумма за 2 единицы товара).
Получается, что организация должна покупателю товар, а он ей деньги...

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

четверг, 9 января 2014 г.

GUID или уникальный идентификатор объекта

GUID (Globally Unique Identifier) - статический уникальный 128-битный идентификатор. Его главная особенность - уникальность, которая позволяет создавать расширяемые сервисы и приложения без опасения конфликтов, вызванных совпадением идентификаторов. Хотя уникальность каждого отдельного GUID не гарантируется, общее количество уникальных ключей настолько велико (2128 или 3,4028×1038), что вероятность того, что в мире будут независимо сгенерированы два совпадающих ключа, крайне мала.
В тексте GUID записывается в виде строки из тридцати двух шестнадцатеричных цифр, разбитой на группы дефисами:
6F9619FF-8B86-D011-B42D-00CF4FC964FF

Получить GUID элемента можно так:
НоменклатураСсылка = Справочники.Номенклатура.НайтиПоНаименованию("Чайник");
Если НЕ
НоменклатураСсылка.Пустая() Тогда
  
Сообщить("GUID = " + НоменклатураСсылка.УникальныйИдентификатор());
КонецЕсли;

Получить элемент по GUID:
ГУИДВидНоменклатуры = Новый УникальныйИдентфикатор(TypeGUID);
ВидНоменклатуры = Справочники.ВидыНоменклатуры.ПолучитьСсылку(ГУИДВидНоменклатуры);

понедельник, 6 января 2014 г.

Округление всегда в большую сторону в запросе

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

ВЫБРАТЬ
   
ЗаказПоставщикуТовары.Номенклатура,
   
ЗаказПоставщикуТовары.Количество,
   
ЗаказПоставщикуТовары.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент КАК ЕдиницаХраненияОстатковКоэффициент,
   
ЗаказПоставщикуТовары.Номенклатура.ЕдиницаДляОтчетов.Коэффициент КАК ЕдиницаДляОтчетовКоэффициент,
   
ЗаказПоставщикуТовары.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент / ЗаказПоставщикуТовары.Номенклатура.ЕдиницаДляОтчетов.Коэффициент КАК ДоляВУпаковке,
   
ЗаказПоставщикуТовары.Количество * (ЗаказПоставщикуТовары.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент / ЗаказПоставщикуТовары.Номенклатура.ЕдиницаДляОтчетов.Коэффициент) КАК КоличествоУпаковок
ПОМЕСТИТЬ втЗаказПоставщику
ИЗ
   
Документ.ЗаказПоставщику.Товары КАК ЗаказПоставщикуТовары
ГДЕ
   
ЗаказПоставщикуТовары.Ссылка = &Ссылка
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   
втЗаказПоставщику.Номенклатура,
   
втЗаказПоставщику.Количество,
   
втЗаказПоставщику.ЕдиницаХраненияОстатковКоэффициент,
   
втЗаказПоставщику.ЕдиницаДляОтчетовКоэффициент,
   
втЗаказПоставщику.ДоляВУпаковке,
   
втЗаказПоставщику.КоличествоУпаковок,
   
ВЫРАЗИТЬ(втЗаказПоставщику.КоличествоУпаковок - 0.5 КАК ЧИСЛО(10, 0)) КАК ЧислоЦелыхЧастей,
   
втЗаказПоставщику.Количество - втЗаказПоставщику.ЕдиницаДляОтчетовКоэффициент * (ВЫРАЗИТЬ(втЗаказПоставщику.КоличествоУпаковок - 0.5 КАК ЧИСЛО(10, 0))) КАК ОстатокЦелого
ПОМЕСТИТЬ втЗаказПоставщикуУпаковка
ИЗ
   
втЗаказПоставщику КАК втЗаказПоставщику
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   
втЗаказПоставщикуУпаковка.Номенклатура,
   
втЗаказПоставщикуУпаковка.Количество,
   
втЗаказПоставщикуУпаковка.ЕдиницаХраненияОстатковКоэффициент,
   
втЗаказПоставщикуУпаковка.ЕдиницаДляОтчетовКоэффициент,
   
втЗаказПоставщикуУпаковка.ДоляВУпаковке,
   
втЗаказПоставщикуУпаковка.КоличествоУпаковок,
   
втЗаказПоставщикуУпаковка.ЧислоЦелыхЧастей,
   
втЗаказПоставщикуУпаковка.ОстатокЦелого,
   
ВЫБОР
        КОГДА
втЗаказПоставщикуУпаковка.ОстатокЦелого = 0
           
ТОГДА втЗаказПоставщикуУпаковка.ЧислоЦелыхЧастей
        ИНАЧЕ втЗаказПоставщикуУпаковка.ЧислоЦелыхЧастей + 1
   
КОНЕЦ * втЗаказПоставщикуУпаковка.ЕдиницаДляОтчетовКоэффициент КАК КоличествоСУчетомУпаковки
ИЗ
   
втЗаказПоставщикуУпаковка КАК втЗаказПоставщикуУпаковка


пятница, 3 января 2014 г.

Назначить конкретный тип элементу формы, который связан с реквизитом формы, имеющим составной тип

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

Объект.ОтветЛицо ПредопределенноеЗначение("Справочник.ФизическиеЛица.ПустаяСсылка");

Если запретить выбор типа в поле ввода (свойство ВыбиратьТип), то реквизиту ОтветЛицо будет назначен тип ссылки на справочник ФизическиеЛица, и для выбора будут предлагаться значения только этого справочника.
Также можно использовать свойство поля ввода ОграничениеТипа, задающее возможные типы данных, которые могут быть введены в поле ввода, и приводить значение соответствующего реквизита к нужному типу:

Массив = Новый Массив();
Массив.Добавить(Тип("СправочникСсылка.ФизическиеЛица"));
НашеОписание = Новый ОписаниеТипов(Массив);
Элементы.ОтветЛицо.ОграничениеТипа = НашеОписание;
Объект.ОтветЛицо = НашеОписание.ПривестиЗначение(Объект.ОтветЛицо);

Программно очистить реквизит в форме

Для того чтобы очистить реквизит в форме, следует присвоить этому реквизиту значение по умолчанию.
Например, для реквизита Контрагент имеющего тип СправочникСсылка.Контрагенты фрагмент кода будет выглядеть следующим образом:

Объект.Контрагент ПредопределенноеЗначение("Справочник.Контрагенты.ПустаяСсылка");

Получить предопределенное значение на клиенте

Т.к. обращение к менеджерам объектов (например, Справочники.<Имя справочника>) на клиенте недоступно, то для получения ссылки на предопределенное значение на клиенте следует использовать метод глобального контекста ПредопределенноеЗначение(). Например, требуется открыть форму предопределенного элемента справочника. Это можно сделать с помощью следующего кода:

&НаКлиенте
Процедура СоздатьСобытие(Команда)

   
ВидСобытия = ПредопределенноеЗначение("Справочник.ВидыСобытий.Встреча");
   
ОткрытьЗначение(ВидСобытия);

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