Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
18 апр 2024, 22:55

Отчет по движению ТМЦ, учет поставщика

Автор r-try, 13 сен 2016, 09:11

0 Пользователей и 1 гость просматривают эту тему.

r-try

Добрый день. Продолжаю потихоньку изучать 1С путем решения прикладной задачи - учет ТМЦ на ИТ-складе.

Первый вопрос:
Появилась необходимость сделать такой отчет - установленное оборудование за период с учетом поставщика. Сейчас есть два регистра накопления - остаток на складе и установленное оборудование. Приход оборудования от нескольких поставщиков, причем наименование может быть одно, но с/н естественно разные, это все заносится в реестр "Остаток на складе". Документом "установка оборудования" соответственно расход в реестре "остаток на складе" и приход в реестре "установленное оборудование". В этом документе поставщик уже не фигурирует, с/н есть. По сему вопрос. как сделать отчет за период по установленному оборудованию с указание от какого поставщика это оборудование пришло.

Пока вижу только один способ
это все заносить в один реестр, допустим "Движение ТМЦ" и там документами менять только признаки, типа "на складе таком-то". "установлено туда-то", "в ремонте там-то" и тд. Тогда можно будет отчет делать по этому реестру.

Вопрос два.
Как реализовать такую вещь, когда заполняется документ "установка оборудования" в ТЧ заносится "номенклатура", "С/Н", "количество". Номенклатура из справочника, остальное ручками, хотелось поле "С/Н" тоже заполнять выбором, т.е. брать из реестра  "остаток на складе", чтобы исключить ошибку при вводе с/н.



alexandr_ll

Полагаю "Реестр"= "Регистр".
По первому вопросу, ежели нужны сведения по установленному оборудованию в разрезе поставщиков, то добавьте в регистр "Установленное оборудование" такой реквизит "Поставщик" и заполняйте его при движении.
По второму вопросу - что вы подразумеваете под "С/Н"?

r-try

Да, реестр-регистр. С/Н - серийный номер. Ручками заполнять не реально, это долго и не упомнишь. надо сверяться постоянно... Надо чтоб по серийному номеру вычислялось от какого поставщика это оборудование пришло.

alexandr_ll

А что за тип значения имеет С/Н - наверное справочник, подчиненный номенклатуре?
В каких регистрах он присутствует?

r-try

Нет, с/н - тупо строка, заполняется документом поступление и храниться в регистре накопления и теперь еще в регистре сведений. Вообщем сейчас сделал регистр сведений "ДвижениеТМЦ" куда заносятся все изменения по номенклатуре с соответствующими отметками (местоположение, статус). Отчет делаю по этому регистру с группировкой по серийному номеру, теперь хоть можно отследить движение конкретной номенклатуры с конкретным серийным номером. Осталось прикрутить к отчету настройку (обработку), которой можно было бы выбрать поставщика - далее находилась бы номенклатура с серийными номерами от этого поставщика и показывалось движение этой номенклатуры с эти серийным номером.
Добавлено: 13 сен 2016, 11:00


Цитата: r-try от 13 сен 2016, 10:36
Нет, с/н - тупо строка, заполняется документом поступление и храниться в регистре накопления и теперь еще в регистре сведений. Вообщем сейчас сделал регистр сведений "ДвижениеТМЦ" куда заносятся все изменения по номенклатуре с соответствующими отметками (местоположение, статус). Отчет делаю по этому регистру с группировкой по серийному номеру, теперь хоть можно отследить движение конкретной номенклатуры с конкретным серийным номером. Осталось прикрутить к отчету настройку (обработку), которой можно было бы выбрать поставщика - далее находилась бы номенклатура с серийными номерами от этого поставщика и показывалось движение этой номенклатуры с эти серийным номером.

Сейчас получается что в регистр сведений заносятся записи так, документ "поступление" - вписывается номенклатура, с С/Н и поставщиком. Документом "установка" заносится запись "номенклатура", "С/Н", местоположение. Соответственно в этой записи поле "поставщик" пустое. А хотелось бы чтоб оно заполнялось путем подстановки по данным из поля "с/н" из предыдущей записи в регистре сведений.

alexandr_ll


[/quote]

Сейчас получается что в регистр сведений заносятся записи так, документ "поступление" - вписывается номенклатура, с С/Н и поставщиком. Документом "установка" заносится запись "номенклатура", "С/Н", местоположение. Соответственно в этой записи поле "поставщик" пустое. А хотелось бы чтоб оно заполнялось путем подстановки по данным из поля "с/н" из предыдущей записи в регистре сведений.
[/quote]
Почему обязательно из предыдущей записи?
Поскольку С/Н это строка, то могут быть неуникальные записи, как подбирать поставщика в этом случае?

r-try

Цитата: alexandr_ll от 13 сен 2016, 11:23


Сейчас получается что в регистр сведений заносятся записи так, документ "поступление" - вписывается номенклатура, с С/Н и поставщиком. Документом "установка" заносится запись "номенклатура", "С/Н", местоположение. Соответственно в этой записи поле "поставщик" пустое. А хотелось бы чтоб оно заполнялось путем подстановки по данным из поля "с/н" из предыдущей записи в регистре сведений.
[/quote]
Почему обязательно из предыдущей записи?
Поскольку С/Н это строка, то могут быть неуникальные записи, как подбирать поставщика в этом случае?
[/quote]

С уникальностью да, беда. Но с/н попадают в базу из документа "поступление", заводить из в справочник не хочу, так как тогда при отмене проведения записи не потрутся, да и не изменишь их при изменении документа и его перепроведении, или я не прав? Тут еще момент, что некоторое оборудование идет вообще без с/н, как ты быть с поставщиком тоже не особо понятно. Будет видно из практики, пока не подскажите как сделать подстановку поставщика путем отбора по с/н?

alexandr_ll

Сделать запрос по регистру сведений с отбором по с/н и получить поставщика.
Подробнее см. например : http://helpme1c.ru/registry-svedenij-v-yazyke-1s-8-v-primerax

Регистры сведений в языке 1С 8.3, 8.2 (в примерах)

Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.

/// Как прочитать записи регистра сведений
/// в 1с 8.3, 8.2

&НаСервере
Процедура КакПрочитатьЗаписиРегистраСведенийНаСервере()

// Прочитаем все записи регистра сведений "ЦенаНаЕдуДляКлиентов"
// для организации ООО "Ромашка", упорядоченные по дате.

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

Запрос.УстановитьПараметр(
"ВыбОрганизация",
Справочники.Организации.НайтиПоНаименованию("ООО ""Ромашка""")
);

РезультатЗапроса = Запрос.Выполнить();

Записи = РезультатЗапроса.Выбрать();

Пока Записи.Следующий() Цикл

Сообщить(
"[" + Записи.Период + "] " +
Записи.Контрагент + " " +
Записи.Номенклатура + " " +
Записи.Цена + " руб."
);

КонецЦикла;

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

/// Как получить наиболее поздние записи (срез последних)
/// регистра сведений на указанную дату (включительно)
/// в 1с 8.3, 8.2

&НаСервере
Процедура КакПолучитьНаиболееПоздниеЗаписиРегистраСведенийНаСервере()

// За возможности выборки наиболее поздних записей регистра
// сведений (среза последних) в разрезе заданной аналитики
// отвечает виртуальная таблица СрезПоследних.
// У неё есть следующие параметры:
// 1. Период (включительно)
// 2. Условие (например, Организация = &ВыбОрганизация)

// Получим цены на бананы для каждого контрагента
// на конец 1 квартала 2014 года (включительно)
// по организации ООО "Ромашка".

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЦенаНаЕдуДляКлиентовСрезПоследних.Период,
| ЦенаНаЕдуДляКлиентовСрезПоследних.Активность,
| ЦенаНаЕдуДляКлиентовСрезПоследних.Номенклатура,
| ЦенаНаЕдуДляКлиентовСрезПоследних.Контрагент,
| ЦенаНаЕдуДляКлиентовСрезПоследних.Организация,
| ЦенаНаЕдуДляКлиентовСрезПоследних.Цена
|ИЗ
| РегистрСведений.ЦенаНаЕдуДляКлиентов.СрезПоследних(
| ДАТАВРЕМЯ(2014, 03, 31, 23, 59, 59),
| Активность = Истина И
| Организация = &ВыбОрганизация И
| Номенклатура = &ВыбНоменклатура
| ) КАК ЦенаНаЕдуДляКлиентовСрезПоследних
|УПОРЯДОЧИТЬ ПО
| ЦенаНаЕдуДляКлиентовСрезПоследних.Контрагент";

Запрос.УстановитьПараметр("ВыбОрганизация",
Справочники.Организации.НайтиПоНаименованию("ООО ""Ромашка""")
);
Запрос.УстановитьПараметр("ВыбНоменклатура",
Справочники.Номенклатура.НайтиПоНаименованию("Банан")
);

РезультатЗапроса = Запрос.Выполнить();

Записи = РезультатЗапроса.Выбрать();

Пока Записи.Следующий() Цикл
Сообщить(
"[" + Записи.Контрагент + ", " + Записи.Период + "] " +
Записи.Номенклатура + " " +
Записи.Цена + " руб."
);
КонецЦикла;

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

/// Как получить наиболее ранние записи (срез первых)
/// регистра сведений на указанную дату (включительно)
/// в 1с 8.3, 8.2

&НаСервере
Процедура КакПрочитатьНаиболееРанниеЗаписиРегистраСведенийНаСервере()

// За возможности выборки наиболее ранних записей регистра
// сведений (среза первых) в разрезе заданной аналитики
// отвечает виртуальная таблица СрезПервых.
// У неё есть следующие параметры:
// 1. Период (включительно)
// 2. Условие (например, Организация = &ВыбОрганизация)

// ! Нужно внимательно вдуматься. СрезПервых получает по каждой
// комбинации измерений наиболее раннюю запись, но НЕ БОЛЕЕ
// РАННЮЮ, чем указанная дата.

// Получим самые первые цены, которые были установлены на бананы
// для каждого контрагента в 2014 году (включительно)
// по организации ООО "Ромашка".

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

Запрос.УстановитьПараметр("ВыбОрганизация",
Справочники.Организации.НайтиПоНаименованию("ООО ""Ромашка""")
);
Запрос.УстановитьПараметр("ВыбНоменклатура",
Справочники.Номенклатура.НайтиПоНаименованию("Банан")
);

РезультатЗапроса = Запрос.Выполнить();

Записи = РезультатЗапроса.Выбрать();

Пока Записи.Следующий() Цикл
Сообщить(
"[" + Записи.Контрагент + ", " + Записи.Период + "] " +
Записи.Номенклатура + " " +
Записи.Цена + " руб."
);
КонецЦикла;

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

/// Как найти и изменить програмно записи в регистр сведений
/// документа в 1с 8.3, 8.2

&НаСервере
Процедура КакНайтиИИзменитьЗаписиДокументаНаСервере()

// Предположим, у нас есть ссылка на проведенный документ
// "Установка цен на еду" № ВМБП-000001

УстановкаЦенСсылка =
Документы.УстановкаЦенНаЕдуДляКлиентов.НайтиПоНомеру(
"ВМБП-000001", '20141231'
);

// Мы знаем, что этот документ делает записи в регистр
// сведений "ЦенаНаЕдуДляКлиентов":
// [Организация, Контрагент, Номенклатура] [Цена]

// Наша задача: найти эти записи и изменит их (например, удвоим
// цену) и записать вместо старых.

// Используем объектную технику получения записей,
// ведь мы будем их изменять.

УстановкаЦен = УстановкаЦенСсылка.ПолучитьОбъект();

// Получим набор записей этого документа в регистр
// "ЦенаНаЕдуДляКлиентов"

НаборЗаписей = УстановкаЦен.Движения.ЦенаНаЕдуДляКлиентов;

// Прочитаем записи из базы данных.

НаборЗаписей.Прочитать();

Для Каждого Запись Из НаборЗаписей Цикл

// Выведем старые значения.
Сообщить(
"[" + Запись.Организация + ", " +
Запись.Контрагент + ", " +
Запись.Номенклатура + "] " +
"[" + Запись.Цена + "]"
);

Запись.Цена = Запись.Цена * 2;

КонецЦикла;

// Добавим новую запись.

НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Период = ТекущаяДата();
НоваяЗапись.Организация =
Справочники.Организации.НайтиПоНаименованию("ООО ""Ромашка""");
НоваяЗапись.Контрагент =
Справочники.Контрагенты.НайтиПоНаименованию("Петров Ю.В.");
НоваяЗапись.Номенклатура =
Справочники.Номенклатура.НайтиПоНаименованию("Банан");
НоваяЗапись.Цена = 500;

// Разом запишем набор записей.
НаборЗаписей.Записать(
Истина // Удалим старые записи и запишем вместо них новые.
);

// Теперь записи регистра "ЦенаНаЕдуДляКлиентов" для документа
// № ВМБП000001, отличаются от тех, что были записаны
// документом при проведении. Чтобы вернуть их к начальному виду
// нужно заново провести документ.

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

/// Как прочитать записи документа в регистр сведений запросом
/// в 1с 8.3, 8.2

&НаСервере
Процедура КакПрочитатьЗаписиДокументаЗапросомНаСервере()

// Этот прием используется, если не требуется изменять
// найденные записи.

// Предположим, у нас есть ссылка на проведенный документ
// "Установка цен на еду" № ВМБП-000001

УстановкаЦенСсылка =
Документы.УстановкаЦенНаЕдуДляКлиентов.НайтиПоНомеру(
"ВМБП-000001", '20141231'
);

// Мы знаем, что этот документ делает записи в регистр
// сведений "ЦенаНаЕдуДляКлиентов".
// Прочитаем эти записи запросом.

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

Запрос.УстановитьПараметр(
"ВыбРегистратор",
УстановкаЦенСсылка
);

РезультатЗапроса = Запрос.Выполнить();

Записи = РезультатЗапроса.Выбрать();

Пока Записи.Следующий() Цикл
Сообщить(
"[" + Записи.Организация + ", " +
Записи.Контрагент + ", " +
Записи.Номенклатура + "] " +
"[" + Записи.Цена + "] <" +
Записи.Регистратор + ">"
);
КонецЦикла;

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

/// Как создать записи в регистр сведений без привязки к
/// документу в 1с 8.3, 8.2

&НаСервере
Процедура КакСоздатьЗаписиБезПривязкиКДокументуНаСервере()

// Создавать записи в регистре сведений без привязки
// к документу можно только для регистров, у которых
// выбран режим записи "Независимый". В нашей конфигурации
// таким регистром является "КурсВалют".
// Если бы мы захотели проделать такую же штуку для
// регистра "ЦенаНаЕдуДляКлиентов", то нам бы пришлось
// воспользоваться документом "ОперацияБух" или им подобным
// для ручных операций (см. аналогичный пример в регистрах
// накопления).

// Пример №1.

// Для единичных записей удобно пользоваться менеджером
// записей.

НоваяЗапись = РегистрыСведений.КурсВалют.СоздатьМенеджерЗаписи();
НоваяЗапись.Период = '20140101';
НоваяЗапись.Валюта = Справочники.Валюты.НайтиПоНаименованию("Доллар");
НоваяЗапись.Курс = 30;
НоваяЗапись.Записать(
Истина // замещать, если уже есть запись с такими же измерениями
// и таким же периодом
);

// Пример №2.

// При помощи менеджера можно также легко
// менять или удалять единичные записи.
// Найдём, изменим, а затем удалим созданную запись.

Выборка = РегистрыСведений.КурсВалют.Выбрать('20140101', '20140101');
Если Выборка.Следующий() Тогда
Запись = Выборка.ПолучитьМенеджерЗаписи();
// изменим
Запись.Прочитать();
Запись.Курс = 25;
// запишем
Запись.Записать(Истина);
// и тут же удалим
Запись.Удалить();
КонецЕсли;

// Пример №3.

// Если нужно изменить сразу много записей -
// удобнее всего использовать набор записей.

// Запишем курсы валют за первые 3 дня 2014 года.

Доллар = Справочники.Валюты.НайтиПоНаименованию("Доллар");

НаборЗаписей = РегистрыСведений.КурсВалют.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Валюта.Установить(Доллар);

Запись01 = НаборЗаписей.Добавить();
Запись01.Период = '20140101';
Запись01.Валюта = Доллар;
Запись01.Курс = 30;

Запись02 = НаборЗаписей.Добавить();
Запись02.Период = '20140102';
Запись02.Валюта = Доллар;
Запись02.Курс = 40;

Запись03 = НаборЗаписей.Добавить();
Запись03.Период = '20140103';
Запись03.Валюта = Доллар;
Запись03.Курс = 60;

// Запишем весь набор разом.

НаборЗаписей.Записать(
Истина // затрём все другие записи по
// доллару (мы установили его в отборе)
);

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

/// Скачать и выполнить эти примеры на компьютере

Похожие темы (5)

Рейтинг@Mail.ru

Поиск