У многих есть вариации на тему учета рабочего времени (своего или своих подчиненных) в различных конфигурациях. И почти ничто не предоставляет таких возможностей управления задачами внутри проекта, как MS-Project. Так давайте совместим все это.
И не статья это совсем, а просто маленькое описание недавнего опыта, которым захотелось поделиться.
Пошаговой инструкции со скриншотами тоже не ждите. Думаю, что разберетесь и так 🙂
Запись данных:
- Создаем в MS-SQL базу со следующей структурой (можно также все это сделать и в MS-Excel, обозвав листы по именам таблиц и задав заголовки колонок, соответственно именам полей):
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Таблица_назначений]') AND type in (N'U')) BEGIN CREATE TABLE [dbo].[Таблица_назначений]( [Название задачи] [nvarchar](100) NOT NULL, [Название ресурса] [nvarchar](100) NOT NULL, [% завершения по трудозатратам] [int] NOT NULL, [Трудозатраты] [nvarchar](50) NOT NULL, [Единицы] [nvarchar](50) NULL, [UIDЗадачи] [nchar](36) NOT NULL, [UIDРесурса] [nchar](36) NOT NULL ) ON [PRIMARY] END GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Таблица_ресурсов]') AND type in (N'U')) BEGIN CREATE TABLE [dbo].[Таблица_ресурсов]( [Ид] [int] NOT NULL, [Название] [nvarchar](100) NOT NULL, [Краткое название] [nvarchar](30) NOT NULL, [Тип] [nvarchar](50) NULL, [Единицы измерения материалов] [nvarchar](50) NULL, [Группа] [nvarchar](50) NULL, [Адрес электронной почты] [nvarchar](50) NULL, [Учетная запись Windows] [nvarchar](50) NULL, [Макс единиц] [float] NOT NULL, [Стандартная ставка] [float] NOT NULL, [Затраты на использование] [float] NULL, [Заметки] [nvarchar](max) NULL, [UID] [nchar](36) NOT NULL, CONSTRAINT [PK_Таблица_ресурсов] PRIMARY KEY CLUSTERED ( [UID] ASC )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] END GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Таблица_задач]') AND type in (N'U')) BEGIN CREATE TABLE [dbo].[Таблица_задач]( [Ид] [int] NOT NULL, [Название] [nvarchar](100) NOT NULL, [Длительность] [nvarchar](50) NULL, [Начало] [datetime] NOT NULL, [Окончание] [datetime] NULL, [Предшественники] [int] NULL, [Уровень структуры] [int] NOT NULL, [Заметки] [nvarchar](max) NULL, [UID] [nchar](36) NOT NULL, CONSTRAINT [PK_Таблица_задач] PRIMARY KEY CLUSTERED ( [UID] ASC )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] END GO IF NOT EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[Таблица_задач]') AND name = N'IX_Таблица_задач') CREATE NONCLUSTERED INDEX [IX_Таблица_задач] ON [dbo].[Таблица_задач] ( [Ид] ASC )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO IF NOT EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[ВыполненныеЗадачи]')) EXEC dbo.sp_executesql @statement = N'CREATE VIEW [dbo].[ВыполненныеЗадачи] AS SELECT TOP (100) PERCENT dbo.Таблица_назначений.[Название задачи], dbo.Таблица_назначений.[Название ресурса], dbo.Таблица_задач.ДатаВыполнено, CAST(dbo.Таблица_назначений.Трудозатраты AS numeric(10, 2)) AS Трудозатраты, dbo.Таблица_задач.УчтеноВРасчетах, dbo.Таблица_задач.ДатаОплаты FROM dbo.Таблица_назначений INNER JOIN dbo.Таблица_задач ON dbo.Таблица_назначений.[Название задачи] = dbo.Таблица_задач.Название WHERE (dbo.Таблица_назначений.[% завершения по трудозатратам] = 1) ORDER BY dbo.Таблица_назначений.[Название задачи] ' GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[InsertAsg]') AND type in (N'P', N'PC')) BEGIN EXEC dbo.sp_executesql @statement = N'
- В 1С пишем примерно следующий код (для Excel переписать :-)):
// попытка найти настройку коннекта к базе аудита и подключения к ней
//
// Возвращаемое значение:
// Булево - результат успешности подключения
//
Функция Инициализация(ИмяСервера, Пользователь, Пароль, ИмяБазы) Экспорт
Соединение = Новый COMОбъект("ADODB.Connection");
СтрокаКоннекта = "driver={SQL Server};server="+ИмяСервера+";uid="+Пользователь+";pwd="+Пароль+";Database="+ИмяБазы;
Соединение.ConnectionTimeOut=20;
Соединение.CursorLocation=3;
Соединение.CommandTimeout = 16000;
Попытка
Соединение.Open(СтрокаКоннекта);
Исключение
#Если Клиент Тогда
Сообщить("Невозможно установить соединение с базой ТЗ!", СтатусСообщения.Важное);
#КонецЕсли
Соединение = Неопределено;
ИмяБазы = "";
ИмяСервера = "";
Пользователь = "";
Пароль = "";
Возврат Ложь;
КонецПопытки;
Возврат Истина;
КонецФункции
// Запись в аудит действий пользователя
//
// Параметры
// Ссылка - Ссылка на документ
// Возвращаемое значение:
// Булево - результат успешности записи
//
Функция ЗаписатьТЗ(Ссылка, СтрокаСообщений) Экспорт
ВремяВыполнения = ?(Ссылка.Выполнено, Ссылка.ВремяЧасыЗатрачено, Ссылка.ВремяЧасыПланируемое);
ДатаНачала = Ссылка.ДатаНачалаРаботПлан;
Если НЕ ЗначениеЗаполнено(ДатаНачала) Тогда
Возврат Ложь;
КонецЕсли;
Соединение.Execute("exec InsertJob '" + СокрЛП(Ссылка.Номер) + ":" + СокрЛП(Ссылка.Наименование) + "', '"
+ СокрЛП(ВремяВыполнения) + "ч', '"
+ Формат(ДатаНачала, "ДФ='yyyyMMdd HH:mm:ss'") + "', "
+ "null, null, 1, '"
+ СтрокаСообщений + "', '"
+ СокрЛП(Ссылка.УникальныйИдентификатор()) + "'";
Соединение.Execute("exec InsertRes '" + СокрЛП(Ссылка.Исполнитель) + "', '', 'Трудовой', null, null, '"
+ Ссылка.Исполнитель.Email.АдресЭлектроннойПочты + "', null, 1, 0, 0, '', '"
+ СокрЛП(Ссылка.Исполнитель.УникальныйИдентификатор()) + "'");
Соединение.Execute("exec InsertAsg '" + СокрЛП(Ссылка.Номер) + ":" + СокрЛП(Ссылка.Наименование) + "', '"
+ СокрЛП(Ссылка.Исполнитель) + "', " +
+ ?(Ссылка.Выполнено, "100", "0") + ", "
+ СтрЗаменить(СокрЛП(ВремяВыполнения), ",", ".") + ", 1, '"
+ СокрЛП(Ссылка.УникальныйИдентификатор()) + "', '"
+ СокрЛП(Исполнитель.УникальныйИдентификатор()) + "'");
КонецФункции
Чтение
- В MS-Project при открытии файла выбираем источник ODBC (MS-SQL или Excel)
- При первом чтении создаем новую схему. При последующих можно использовать существующую.
Схема сгенерится в принципе сама, т.к. имена таблиц и полей полностью соответствуют проджектовским. Надо только нажимать все время «далее»
Вот, собственно, и все.
Удачи.
З.Ы. Структуру документа тоже не приводил, можно привести к любой своей.
блин… замучался форматировать… потом…
Интересно. При случае попробую.